read

The primary use of read is to capture user input from stdin. It can also be used to parse strings or files that are redirected to it (with < and <<) or piped to it. In each case, what is read is stored as a variable.

read will parse line by line using a space (\n) as the default delimiter. You can use IFS to parse by other characters and/or split the contents into an array.

Example of capturing user input

When we use read to gather user input, the script will pause until the input is provided.

echo "What is your name?"
read name

echo "What is your password?"
read -s pass

read

If you don’t specify variables, read will automatically parse using whitespace

Example of piping to read

Here we use find to collate the files in the current directory and then pipe them to read.

find -type -f  -not -path "./.git/" | read $fname

Example of parsing a file

We will typically read from a source and then do something with each variable that read returns, e.g:

while read line; do
  if [ var == 'something' ]; then
    # do something
done < './input-file.txt

$REPLY

If you do not assign a variable name to store the value that read reads a default ($REPLY) is applied. You can reference this value in your code.

For example the following loop does something if $REPLY is equal to an empty string:

while read;
do
    ((count++))
    if [[ -z "$REPLY" ]]; then
        echo "$count"
    fi
done < "$input