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
}