How to use the read command in Bash?
Solution 1
The read
in your script command is fine. However, you execute it in the pipeline, which means it is in a subshell, therefore, the variables it reads to are not visible in the parent shell. You can either
move the rest of the script in the subshell, too:
echo hello | { read str echo $str }
or use command substitution to get the value of the variable out of the subshell
str=$(echo hello) echo $str
or a slightly more complicated example (Grabbing the 2nd element of ls)
str=$(ls | { read a; read a; echo $a; }) echo $str
Solution 2
Other bash alternatives that do not involve a subshell:
read str <<END # here-doc
hello
END
read str <<< "hello" # here-string
read str < <(echo hello) # process substitution
Solution 3
Typical usage might look like:
i=0
echo -e "hello1\nhello2\nhello3" | while read str ; do
echo "$((++i)): $str"
done
and output
1: hello1
2: hello2
3: hello3
Solution 4
The value disappears since the read command is run in a separate subshell: Bash FAQ 24
Solution 5
To put my two cents here: on KSH, read
ing as is to a variable will work, because according to the IBM AIX documentation, KSH's read
does affects the current shell environment:
The setting of shell variables by the read command affects the current shell execution environment.
This just resulted in me spending a good few minutes figuring out why a one-liner ending with read
that I've used a zillion times before on AIX didn't work on Linux... it's because KSH does saves to the current environment and BASH doesn't!
Comments
-
Determinant over 2 years
When I try to use the
read
command in Bash like this:echo hello | read str echo $str
Nothing echoed, while I think
str
should contain the stringhello
. Can anybody please help me understand this behavior?