Wie arbeitet man mit mehreren Arrays in reinem SH?

Wie arbeitet man mit mehreren Arrays in reinem SH?

Es gibt diese Maschine, wo nur diese shOption verfügbar ist und cutkeine --output-delimiterOption, aber ich muss mit Arrays arbeiten. Ich habe es auf diese Weise versucht, es funktioniert auf meiner Arbeitsmaschine, aber das Fehlen von --output-delimitermacht es mir unmöglich, weiterzumachen.

Wie muss ich vorgehen, um trotz dieser Einschränkungen dieselben Ergebnisse wie auf meinem Arbeitscomputer zu erzielen?

Ich kann es nicht verwenden -d '\n', da es mehr als ein Zeichen ist. Meine Array-Methode erzeugt neue Zeilen statt Leerzeichen. Gängige Tools haben möglicherweise eingeschränkte Funktionen (wie es derjenige, der Busybox kompiliert hat, für richtig hielt). Befehle, die in Busybox nicht verfügbar sind, sind nicht verfügbar.

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

Antwort1

Schmerzlich.

Sie können stattdessen awk verwenden. Awk, sogar BusyBox awk, kann fast das Gleiche wie eine Shell, nur mit mehr syntaktischem Aufwand. Und es hat assoziative Arrays, so viele davon, wie Sie möchten. Sie können externe Befehle über aufrufen system. Es gibt sogar Umleitungs- und Piping-Funktionen, die allerdings eingeschränkter sind als bei einer Shell.

Wenn Sie ein Awk-Skript möchten, das keine Eingaben erfordert, fügen Sie den gesamten Code in einen BEGINBlock ein.

Wenn ich in Ihrem Fall richtig verstehe, was Sie tun möchten, brauchen Sie kein awk. Sie müssen cutdie Zeichenfolge nicht verarbeiten TARGET: Verwenden Sie die Parametererweiterung. BusyBox Ash und Hush unterstützen beide ${VAR#PREFIX}und sind Freunde. Dies funktioniert problemlos, solange Ihre Pfade keine Leerzeichen enthalten.

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

verwandte Informationen