So weisen Sie mehreren Variablen in der Befehlszeile mit Balken Werte zu

9

Ich versuche im Wesentlichen, bestimmte Teile der Ausgabe eines Shell-Befehls mehreren Variablen zuzuordnen, aber ich weiß nicht, wie das geht.

Nehmen Sie der Einfachheit halber an, dass der Befehl auf der Shell bei der Ausführung gedruckt wird

one two three four

was mit a simuliert werden kann

echo "one two three four"

(obwohl das tatsächliche comannd anders ist)

Nun möchte ich den Variablen w1 und w2 das zweite und vierte Wort der Ausgabe (in diesem Fall zwei und vier ) zuweisen .

Ich dachte, ich könnte den Lesebefehl folgendermaßen verwenden :

echo "one two three four" | awk '{print $2 " " $4}' | read w1 w2

aber dies nicht funktioniert, wahrscheinlich , weil der Lesebefehl in einem Teilprozess ausgeführt wird.

Wie würde ich also vorgehen, um das zu erreichen, wonach ich strebe?

René Nyffenegger
quelle

Antworten:

16

Dies funktioniert nicht, da die Ausführung readin einem untergeordneten Prozess erfolgt, der die Umgebung der übergeordneten Umgebung nicht beeinflussen kann.

Sie haben einige Möglichkeiten:

Sie können Ihren Befehl konvertieren in:

w1=$(echo "one two three four" | awk '{print $2}')
w2=$(echo "one two three four" | awk '{print $4}')

Alternativ können Sie IFS ändern und Folgendes verwenden set:

OIFS="$IFS"
IFS=' '
set -- $(echo "one two three four" | awk '{print $2" "$4}')
IFS="$OIFS"
w1=$1 w2=$2

oder ein Here String:

read w1 w2 w3 w4 <<< "one two three four"
Dogbane
quelle
4
Basierend auf der Here-Zeichenfolge: Lesen Sie a1 a2 a3 <<< $ (Echo eins zwei drei)
Petr Uzel
Vielen Dank. Ich wusste nicht über die<<< Here String
René Nyffenegger
1
Aus Sicherheitsgründen sollten Sie verwenden: read -r:do not allow backslashes to escape any characters
Tom Hale