Come assegnare valori a più variabili nella riga di comando con barre


10

Sto essenzialmente cercando di assimilare determinate porzioni dell'output di un comando shell per mulitple variabili, ma non so come farlo.

Per semplicità, supponiamo che il comando sulla shell, quando eseguito, venga stampato

one two three four

che può essere simulato con a

echo "one two three four"

(sebbene l'attuale comannd sia diverso)

Ora, vorrei assegnare la seconda e la quarta parola dell'output (in questo caso due e quattro ) alle variabili w1 e w2 .

Pensavo di poter usare il comando read in questo modo:

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

ma questo non funziona, probabilmente perché il comando read viene eseguito in un processo secondario.

Quindi, come farei per ottenere ciò che sto cercando?


Risposte:


17

Questo non funziona perché readviene eseguito in un processo figlio che non può influire sull'ambiente del genitore.

Hai alcune opzioni:

Puoi convertire il tuo comando in:

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

In alternativa, cambia IFS e usa set:

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

o una stringa Here:

read w1 w2 w3 w4 <<< "one two three four"

4
Basato sulla stringa Here: leggi a1 a2 a3 <<< $ (echo one two three)
Petr Uzel

Molte grazie. Non sapevo del<<< Here String
René Nyffenegger l'

1
Per motivi di sicurezza si dovrebbe usare: read -r:do not allow backslashes to escape any characters
Tom Hale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.