Cómo asignar valores a múltiples variables en la línea de comando con barras

10

Básicamente estoy tratando de asignar ciertas partes de la salida de un comando de shell a varias variables, pero no sé cómo hacerlo.

Por simplicidad, suponga que el comando en el shell, cuando se ejecuta, imprime

one two three four

que se puede simular con un

echo "one two three four"

(aunque el comando real es diferente)

Ahora, me gustaría asignar la segunda y cuarta palabra de la salida (en este caso dos y cuatro ) a las variables w1 y w2 .

Pensé que podría usar el comando de lectura así:

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

pero esto no funciona, probablemente porque el comando de lectura se ejecuta en un subproceso.

Entonces, ¿cómo voy a lograr lo que busco?

René Nyffenegger
fuente

Respuestas:

17

Esto no funciona porque se readejecuta en un proceso secundario que no puede afectar el entorno de los padres.

Tienes pocas opciones:

Puede convertir su comando a:

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

Alternativamente, cambie IFS y use set:

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

o una cadena aquí:

read w1 w2 w3 w4 <<< "one two three four"
dogbane
fuente
44
Basado en la cadena Here: lea a1 a2 a3 <<< $ (echo one two three)
Petr Uzel
Muchas gracias. No sabía sobre el<<< Here String
René Nyffenegger
1
Por razones de seguridad se debe utilizar: read -r:do not allow backslashes to escape any characters
Tom Hale