2011-10-06 11 views

Respuesta

49

El read en su comando de secuencia de comandos está bien. Sin embargo, lo ejecuta en la canalización, lo que significa que está en una subcadena, por lo tanto, las variables a las que lee no son visibles en el shell primario. Puede

  • mover el resto de la secuencia de comandos en el subnivel, también:

    echo hello | { read str 
        echo $str 
    } 
    
  • o utilizar la sustitución de comandos para obtener el valor de la variable de la subcapa

    str=$(echo hello) 
    echo $str 
    

    o un ejemplo un poco más complicado (Agarrando el segundo elemento de ls)

    str=$(ls | { read a; read a; echo $a; }) 
    echo $str 
    
+0

¡Ejemplos impresionantes! Tuve que modificarlo ligeramente en OSX poniendo espacios dentro de las llaves, y un punto y coma después del eco, así: str = $ (ls | {read a; read a; echo $ a;}) –

+5

¿Por qué? es "read a; read a;" requerido * dos veces *? – javadba

+0

@javadba: No se requiere dos veces. El ejemplo dado devuelve el * segundo * elemento de 'ls'. Con un solo 'leer un 'obtendría el primer artículo. No me preguntes por qué el que responde eligió este ejemplo. – Fritz

3

El valor desaparece ya que el comando de lectura se ejecuta en un subnivel separada: Bash FAQ 24

-5

¿Necesita la tubería?

echo -ne "$MENU" 
read NUMBER 
+1

-1: sus comandos 'echo' y' read' no están conectados de ninguna manera. –

+0

¿Eso es malo? Funciona ... – mmrtnt

+0

El póster claramente quiere una manera automatizada de poblar una variable sin tener que ingresarla manualmente. –

33

Otras alternativas de bash que no implican un subnivel:

read str <<END    # here-doc 
hello 
END 

read str <<< "hello"  # here-string 

read str < <(echo hello) # process substitution 
+2

También puede usar un proceso para la cadena aquí como 'leer ABC <<< $ (echo 'aaa bbb ccc')' – maxpolk

8

uso típico podría ser:

i=0 
echo -e "hello1\nhello2\nhello3" | while read str ; do 
    echo "$((++i)): $str" 
done 

y la salida

1: hello1 
2: hello2 
3: hello3 
2

poner las dos centavos aquí: en KSH, read ING es una variable se trabajo, porque de acuerdo a the IBM AIX documentation, de KSH readhace afecta al entorno del shell actual:

El ajuste de las variables de shell el comando de lectura afecta el entorno de ejecución de shell actual.

Esto se tradujo en mí de pasar unos cuantos minutos a averiguar por qué una sola línea que termina con read que he utilizado un millón de veces antes en AIX no funcionaba en Linux ... es porque hace KSH guarda en el entorno actual y BASH no!

0

Otra alternativa es usar la función printf.

printf -v str 'hello' 

Por otra parte, esta construcción, combinado con el uso de comillas simples en su caso, ayuda a evitar los problemas de varios de escape de subcapas y otras formas de interpolación citando.

+0

Si eso es todo lo que intenta lograr, puede hacer 'str = ' hola' Creo que el punto aquí es capturar la salida de un comando en una variable. – mc0e

0

Realmente sólo uso leído con "tiempo" y un bucle de hacerlo:

echo "This is NOT a test." | while read -r a b c theRest; do 
echo "$a" "$b" "$theRest"; done 

Ésta es una prueba.
Por lo que vale, he visto la recomendación de usar siempre -r con el comando de lectura en bash.

Cuestiones relacionadas