¿Cómo trabajar con múltiples matrices en sh puro?

¿Cómo trabajar con múltiples matrices en sh puro?

Hay esta máquina que solo shestá disponible y cutno tiene --output-delimiteropción pero necesito trabajar con arreglos, lo intenté de esta manera, funciona en mi máquina de trabajo, pero la falta de ella --output-delimiterme impide ir más lejos.

¿Cómo debo proceder para mantener los mismos resultados que mi máquina de trabajo con estas limitaciones?

No puedo usarlo -d '\n'porque tiene más de un carácter, mi método de formación arroja nuevas líneas en lugar de espacios. Las herramientas comunes pueden tener funciones reducidas (como lo consideró oportuno el que compiló Busybox). Los comandos que no están disponibles en Busybox no estarán disponibles.

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

Respuesta1

Penosamente.

Lo que puedes hacer es usar awk en su lugar. Awk, incluso BusyBox awk, puede hacer la mayor parte de lo que puede hacer un shell, solo que con más sobrecarga sintáctica. Y tiene matrices asociativas, tantas como quieras. Puede llamar comandos externos a través de system. Incluso hay funciones de redirección y canalización, aunque son más limitadas que en un shell.

Si desea un script awk que no reciba ninguna entrada, coloque todo el código en un BEGINbloque.

En tu caso, si entiendo lo que quieres hacer correctamente, no necesitas awk. No es necesario cutprocesar la TARGETcadena: utilice la expansión de parámetros. BusyBox ash and sish tanto a apoyo ${VAR#PREFIX}como a amigos. Esto funciona fácilmente siempre que sus caminos no contengan espacios.

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

información relacionada