Como atribuir valores a várias variáveis ​​na linha de comando com barras

10

Estou essencialmente tentando atribuir certas porções da saída de um comando shell para várias variáveis, mas não sei como fazer isso.

Por uma questão de simplicidade, suponha que o comando no shell, quando executado, imprima

one two three four

que pode ser simulado com um

echo "one two three four"

(embora o comannd real seja diferente)

Agora, eu gostaria de atribuir a segunda e a quarta palavra da saída (neste caso, dois e quatro ) às variáveis w1 e w2 .

Eu pensei que poderia usar o comando ler assim:

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

mas isso não funciona, provavelmente porque o comando read é executado em um subprocesso.

Então, como eu alcançaria o que estou procurando?

René Nyffenegger
fonte

Respostas:

17

Isso não funciona porque readé executado em um processo filho que não pode afetar o ambiente dos pais.

Você tem poucas opções:

Você pode converter seu comando para:

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

Como alternativa, altere o IFS e use set:

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

ou uma string Here:

read w1 w2 w3 w4 <<< "one two three four"
dogbane
fonte
4
Com base no Aqui Cordas: ler a1 a2 a3 <<< $ (echo um dois três)
Petr Uzel
Muito obrigado. Eu não sabia sobre o<<< Here String
René Nyffenegger 11/04
1
Por razões de segurança, você deve usar: read -r:do not allow backslashes to escape any characters
Tom Hale