Como trabalhar com múltiplos arrays em sh puro?

1

Existe esta máquina onde apenas sh está disponível, e cut não tem --output-delimiter opção, mas eu preciso trabalhar com matrizes, eu tentei desta forma, ele funciona na minha máquina de trabalho, mas a falta de --output-delimiter me impossibilita de ir mais longe.

Como devo proceder para manter os mesmos resultados da minha máquina de trabalho com essas restrições?

Eu não posso usar -d '\n' , pois é mais do que um char, meu método de arrays lança novas linhas em vez de espaços. Ferramentas comuns podem ter funções reduzidas (como aquele que compilou o busybox que é visto) Comandos não disponíveis no busybox não estarão disponíveis.

#!/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
    
por Zulgrib 25.05.2017 / 00:28

1 resposta

3

Dolorosamente.

O que você pode fazer é usar o awk. O Awk, mesmo o BusyBox awk, pode fazer a maior parte do que um shell pode fazer, apenas com mais sobrecarga sintática. E tem matrizes associativas, como muitos daqueles que você deseja. Você pode chamar comandos externos por meio de system . Há até um redirecionamento e funcionalidade de tubulação, embora seja mais limitado do que em um shell.

Se você quiser um script awk que não recebe nenhuma entrada, coloque todo o código em um bloco BEGIN .

No seu caso, se eu entendi o que você quer fazer corretamente, você não precisa do awk. Você não precisa de cut para processar a string TARGET : use a expansão de parâmetro. BusyBox ash e hush tanto apoio ${VAR#PREFIX} e amigos. Isso funciona facilmente, desde que seus caminhos não contenham espaços.

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