![순수 sh에서 여러 배열을 사용하는 방법은 무엇입니까?](https://linux55.com/image/112143/%EC%88%9C%EC%88%98%20sh%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%EB%B0%B0%EC%97%B4%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이 머신만 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
}