Parsen mehrerer Ausgaben
Einführung
Also Ihr myscript
Ausgabe von 3 Zeilen, könnte wie folgt aussehen:
myscript() { echo $'abc\ndef\nghi'; }
ou
myscript() { local i; for i in abc def ghi ;do echo $i; done ;}
Ok, dies ist eine Funktion, kein Skript (kein Pfad erforderlich ./
), aber die Ausgabe ist die gleiche
myscript
abc
def
ghi
Unter Berücksichtigung von Ergebniscode
Um den Ergebniscode zu prüfen, wird die Testfunktion:
myscript() { local i;for i in abc def ghi ;do echo $i;done;return $((RANDOM%128));}
1. Speicherung mehrerer Ausgaben in einer einzigen Variablen, mit Zeilenumbrüche
Ihre Operation ist korrekt:
RESULT=$(myscript)
Über Ergebniscode könnten Sie hinzufügen:
RCODE=$?
sogar in derselben Zeile:
RESULT=$(myscript) RCODE=$?
Dann
echo $RESULT $RCODE
abc def ghi 66
echo "$RESULT"
abc
def
ghi
echo ${RESULT@Q}
$'abc\ndef\nghi'
printf '%q\n' "$RESULT"
$'abc\ndef\nghi'
aber für die Anzeige der Variablendefinition, verwenden Sie declare -p
:
declare -p RESULT RCODE
declare -- RESULT="abc
def
ghi"
declare -- RCODE="66"
2. Parsen mehrerer Ausgaben in einem Array, mit mapfile
Speichern der Antwort in myvar
variabel:
mapfile -t myvar < <(myscript)
echo ${myvar[2]}
ghi
anzeigen $myvar
:
declare -p myvar
declare -a myvar=([0]="abc" [1]="def" [2]="ghi")
Unter Berücksichtigung von Ergebniscode
Falls Sie nach einem Ergebniscode suchen müssen, können Sie dies tun:
RESULT=$(myscript) RCODE=$?
mapfile -t myvar <<<"$RESULT"
declare -p myvar RCODE
declare -a myvar=([0]="abc" [1]="def" [2]="ghi")
declare -- RCODE="40"
3. Parsing mehrerer Ausgaben durch aufeinanderfolgende read
in der Befehlsgruppe
{ read firstline; read secondline; read thirdline;} < <(myscript)
echo $secondline
def
Anzeige der Variablen:
declare -p firstline secondline thirdline
declare -- firstline="abc"
declare -- secondline="def"
declare -- thirdline="ghi"
Ich verwende oft:
{ read foo;read foo total use free foo ;} < <(df -k /)
Dann
declare -p use free total
declare -- use="843476"
declare -- free="582128"
declare -- total="1515376"
Unter Berücksichtigung von Ergebniscode
Derselbe vorangestellte Schritt:
RESULT=$(myscript) RCODE=$?
{ read firstline; read secondline; read thirdline;} <<<"$RESULT"
declare -p firstline secondline thirdline RCODE
declare -- firstline="abc"
declare -- secondline="def"
declare -- thirdline="ghi"
declare -- RCODE="50"
2 Stimmen
Das überrascht mich. haben sie nicht $(cat ./myscipt) ? sonst hätte ich erwartet, dass es versucht, die Befehle abc, def und ghi auszuführen
0 Stimmen
@litb: Ja, ich denke schon; Sie können auch $(<./myscript) verwenden, was die Ausführung eines Befehls vermeidet.
3 Stimmen
(Anmerkung: Die beiden obigen Kommentare beziehen sich auf eine Überarbeitung der Frage, die mit Ich habe ein Skript "myscript", das Folgendes enthält was zu den Fragen führte. Die aktuelle Überarbeitung der Frage ( Ich habe ein Skript "myscript", das Folgendes ausgibt ) macht die Kommentare überflüssig. Die Überarbeitung stammt jedoch vom 11.11.2011, lange nachdem die beiden Kommentare abgegeben wurden.
0 Stimmen
Für
$IFS
siehe Was ist die genaue Bedeutung vonIFS=$'\n'
0 Stimmen
Verwandt: Warum gehen Zeilenumbrüche bei der Verwendung der Befehlssubstitution verloren? , Warum verschluckt mein Shell-Skript Leerzeichen oder andere Sonderzeichen? (unter Unix&Linux).