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?


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"

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.