순수 sh에서 여러 배열을 사용하는 방법은 무엇입니까?

순수 sh에서 여러 배열을 사용하는 방법은 무엇입니까?

이 머신만 sh사용할 수 있고 옵션이 cut없지만 --output-delimiter배열을 사용해야 합니다. 이 방법을 시도해 보았는데 내 작업 머신에서 작동하지만 부족함으로 --output-delimiter인해 더 이상 진행할 수 없습니다.

이러한 제한 하에서 어떻게 작업 기계와 동일한 결과를 계속 유지해야 합니까?

-d '\n'두 개 이상의 문자이고 배열 방법이 공백 대신 새 줄을 던지기 때문에 사용할 수 없습니다 . 일반적으로 사용되는 도구의 기능은 비지박스를 컴파일한 사람의 판단에 따라 줄어들 수 있으며 비지박스에서 사용할 수 없는 명령은 사용할 수 없게 됩니다.

#!/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
}

관련 정보