Как работать с несколькими массивами в чистом sh?

Как работать с несколькими массивами в чистом sh?

Есть машина, на которой 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
}

Связанный контент