Existe essa máquina onde só sh
está disponível, e cut
não tem --output-delimiter
opção mas preciso trabalhar com arrays, tentei dessa forma, funciona na minha máquina de trabalho, mas a falta dela --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?
Não posso usar -d '\n'
porque tem mais de um caractere, meu método de array lança novas linhas em vez de espaços. Ferramentas comuns podem ter funções reduzidas (como quem compilou o busybox achou adequado). 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
Responder1
Dolorosamente.
O que você pode fazer é usar o awk. Awk, até mesmo BusyBox awk, pode fazer a maior parte do que um shell pode fazer, apenas com mais sobrecarga sintática. E tem arrays associativos, quantos você quiser. Você pode chamar comandos externos através do system
. Existe até funcionalidade de redirecionamento e canalização, embora seja mais limitada do que em um shell.
Se você quiser um script awk que não receba nenhuma entrada, coloque todo o código em um BEGIN
bloco.
No seu caso, se entendi o que você quer fazer corretamente, você não precisa do awk. Você não precisa cut
processar a TARGET
string: use a expansão de parâmetros. BusyBox cinza e silêncio tanto apoio ${VAR#PREFIX}
quanto 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
}