Есть машина, на которой sh
доступен только , и cut
нет --output-delimiter
опции , но мне нужно работать с массивами, я попробовал этот способ, он работает на моей рабочей машине, но отсутствие --output-delimiter
не позволяет мне идти дальше.
Как мне поступить, чтобы сохранить те же результаты, что и на моей рабочей машине, учитывая эти ограничения?
Я не могу использовать, -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
}