如何在纯 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,可以完成 shell 可以完成的大部分工作,只是语法开销更大。它有关联数组,你想要多少就多少。您可以通过 调用外部命令system。甚至还有重定向和管道功能,尽管它比 shell 中的限制更多。

如果您想要一个不接受任何输入的 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
}

相关内容