How to use the read command in Bash?

111,848

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, reading 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!

Share:
111,848
Determinant
Author by

Determinant

An IT enthusiast, GNU/Linux-lover and arty idiot.

Updated on August 13, 2021

Comments

  • Determinant
    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 string hello. Can anybody please help me understand this behavior?