이 기계에는 옵션만 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
}