순수 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는 지원 ${VAR#PREFIX}과 친구 모두를 재화하고 숨깁니다. 경로에 공백이 포함되어 있지 않으면 쉽게 작동합니다.

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

관련 정보