Es gibt diese Maschine, wo nur diese sh
Option verfügbar ist und cut
keine --output-delimiter
Option, aber ich muss mit Arrays arbeiten. Ich habe es auf diese Weise versucht, es funktioniert auf meiner Arbeitsmaschine, aber das Fehlen von --output-delimiter
macht 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 BEGIN
Block ein.
Wenn ich in Ihrem Fall richtig verstehe, was Sie tun möchten, brauchen Sie kein awk. Sie müssen cut
die 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
}