Comment attribuer des valeurs à plusieurs variables en ligne de commande avec des barres

10

J'essaie essentiellement d'assigner certaines parties de la sortie d'une commande shell à plusieurs variables, mais je ne sais pas comment faire.

Par souci de simplicité, supposons que la commande sur le shell, lorsqu'elle s'exécute, imprime

one two three four

qui peut être simulé avec un

echo "one two three four"

(bien que le comannd réel soit différent)

Maintenant, je voudrais affecter les deuxième et quatrième mots de la sortie (dans ce cas deux et quatre ) aux variables w1 et w2 .

Je pensais pouvoir utiliser la commande read comme ceci:

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

mais cela ne fonctionne pas, probablement parce que la commande de lecture est exécutée dans un sous-processus.

Alors, comment pourrais-je réaliser ce que je recherche?

René Nyffenegger
la source

Réponses:

17

Cela ne fonctionne pas car les readexécutions dans un processus enfant ne peuvent pas affecter l'environnement du parent.

Vous avez quelques options:

Vous pouvez convertir votre commande en:

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

Vous pouvez également modifier IFS et utiliser set:

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

ou une chaîne Here:

read w1 w2 w3 w4 <<< "one two three four"
dogbane
la source
4
Basé sur la chaîne Here: lire a1 a2 a3 <<< $ (écho un deux trois)
Petr Uzel
Merci beaucoup. Je ne connaissais pas le<<< Here String
René Nyffenegger
1
Pour plus de sécurité , vous devez utiliser: read -r:do not allow backslashes to escape any characters
Tom Hale