純粋な sh で複数の配列を操作するにはどうすればよいでしょうか?

純粋な sh で複数の配列を操作するにはどうすればよいでしょうか?

shのみが使用可能で、オプションcutはありません--output-delimiterが、配列を操作する必要があるマシンがあります。この方法を試したところ、作業マシンでは機能しますが、 がないため、--output-delimiterそれ以上進むことができません。

これらの制約がある状態で、作業マシンと同じ結果を維持するにはどうすればよいですか?

1 文字以上なので使用できません-d '\n'。私の配列方法では、スペースの代わりに新しい行がスローされます。一般的なツールでは機能が削減されている場合があります (busybox をコンパイルした人が適切と判断したため)。busybox で使用できないコマンドは使用できません。

#!/system/bin/sh
count=0
LOG=/data/media/0/Logs/MountBind.log
SDID="C10E-14EE"
SOURCES=""
SOURCES="${SOURCES} /storage/MicroSD/Data";SOURCES="${SOURCES} /mnt/runtime/default/MicroSD/Data";SOURCES="${SOURCES} /mnt/runtime/read/MicroSD/Data";SOURCES="${SOURCES} /mnt/runtime/write/MicroSD/Data";
TARGETS=""
TARGETS="${TARGETS} /storage/$SDID/Data";TARGETS="${TARGETS} /mnt/runtime/default/$SDID/Data";TARGETS="${TARGETS} /mnt/runtime/read/$SDID/Data";TARGETS="${TARGETS} /mnt/runtime/write/$SDID/Data";

mountbind() {
    for SOURCE in $SOURCES; do
        count=$((count + 1))
        echo $SOURCE >>$LOG
        su --mount-master mount -o bind $SOURCE $(echo $TARGETS | cut -d ' ' -f$count --output-delimiter=\n) 1>>$LOG
    done
}

mountbind

echo "\n******************************************\nMount output\n******************************************" >> $LOG
mount >> $LOG
chown 1023:1023 $LOG
chmod 770 $LOG

答え1

痛いほどに。

代わりに awk を使うこともできます。Awk、BusyBox awk でも、シェルでできることのほとんどを実行できますが、構文上のオーバーヘッドが高くなります。また、連想配列をいくつでも使用できます。 を通じて外部コマンドを呼び出すことができますsystem。リダイレクト機能やパイプ機能もありますが、シェルよりも制限があります。

入力を一切受け取らない awk スクリプトが必要な場合は、すべてのコードをブロック内に配置しますBEGIN

あなたの場合、あなたが何をしたいのか正しく理解していれば、awk は必要ありません。文字列cutを処理する必要はありませんTARGET。パラメータ拡張を使用してください。BusyBox の ash と hush はどちらもサポートしており${VAR#PREFIX}、友達です。パスにスペースが含まれていない限り、これは簡単に機能します。

mountbind() {
    for SOURCE in $SOURCES; do
        TARGET=${TARGETS%% *}; TARGETS=${TARGETS#* }
        su --mount-master mount -o bind "$SOURCE" "$TARGET" 1>>"$LOG"
    done
}

関連情報