純粋なshで複数の配列を使用する方法は?

純粋なshで複数の配列を使用する方法は?

このマシンだけがsh利用可能でオプションはcutありません--output-delimiterが、配列を使用する必要があります。私はこれを試してみましたが、私の作業機械で動作しますが、不足のために--output-delimiterこれ以上進むことはできません。

これらの制限の下で、どのように作業機械と同じ結果を維持する必要がありますか?

-d '\n'2つ以上の文字で、配列メソッドが空白の代わりに新しい行をスローするため、使用できません。一般的に使用されるツールの機能は、ビジボックスをコンパイルした人の判断によって減らすことができ、ビジボックスで使用できないコマンドは使用できなくなります。

#!/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とBooはどちらもサポーターで${VAR#PREFIX}友達です。パスにスペースがないと簡単に達成できます。

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

おすすめ記事