Comment utiliser la commande read en Bash?

Lorsque j'essaie d'utiliser le read commande de Bash comme ceci:

echo hello | read str
echo $str

Nothing otherwise, while I think str devrait contenir la chaîne hello. Quelqu'un peut-il m'aider à comprendre ce comportement?

46
demandé sur codeforester 2011-10-06 18:45:25

8 réponses

read dans votre script, la commande est correcte. Cependant, vous l'exécutez dans le pipeline, ce qui signifie qu'il est dans un sous-puits, donc les variables qu'il lit ne sont pas visibles dans le shell parent. Vous pouvez soit

  • déplacer le reste du script en shell interne est exécuté, trop:

    echo hello | { read str
      echo $str
    }
    
  • ou utilisez la substitution de commande pour obtenir la valeur de la variable hors de la sous-cellule

    str=$(echo hello)
    echo $str
    
    str=$(ls | { read a; read a; echo $a; })
    echo $str
    
53
répondu jpalecek 2017-06-11 18:15:07

autres alternatives bash qui n'impliquent pas de sous-couche:

read str <<END             # here-doc
hello
END

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

read str < <(echo hello)   # process substitution
35
répondu glenn jackman 2011-10-06 15:15:22

L'usage typique peut ressembler à:

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

et de sortie

1: hello1
2: hello2
3: hello3
8
répondu Shizzmo 2011-10-06 15:34:57

la valeur disparaît puisque la commande read est exécutée dans un sous-puits séparé: Bash FAQ 24

3
répondu l0b0 2011-10-06 15:00:11

Pour mettre mon grain de sel ici: sur KSH, reading est à une variable travailler, parce que selon AIX IBM documentation, KSH's read affecte l'environnement shell actuel:

le paramétrage des variables shell par la commande read affecte l'environnement actuel d'exécution du shell.

cela m'a juste amené à passer quelques bonnes minutes à comprendre pourquoi un one-liner se terminant par read que j'ai utilisé un zillion de fois sur AIX n'a pas fonctionné sur Linux... C'est parce que KSH sauve à L'environnement actuel et que BASH ne le fait pas!

2
répondu RAKK 2014-04-04 17:36:03

je n'ai vraiment lire avec "tout" et une boucle:

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

Ceci est un test.

Pour ce que ça vaut, j'ai vu la recommandation d'utiliser toujours-r avec la commande read en bash.

0
répondu JackDR 2017-07-19 17:46:11

une autre alternative consiste à utiliser la fonction printf.

printf -v str 'hello'

de plus, Cette construction, combinée avec l'utilisation de guillemets simples le cas échéant, aide à éviter les problèmes de multi-escape de subshells et d'autres formes de citation interpolative.

-1
répondu jxqz 2014-04-04 23:16:34

vous avez besoin de la pipe?

echo -ne "$MENU"
read NUMBER
-5
répondu mmrtnt 2011-10-06 15:02:47