Reading a Standard Input Stream

Learn how to read a standard input stream using a while loop.

We'll cover the following

Contacts in an associative array

The while loop is well fit for handling an input stream. Here is an example of such a task. Let’s suppose that we need a script that reads a text file. It should make an associative array from the file content.

Let’s consider the contacts.sh script for managing the list of contacts:

#!/bin/bash

declare -A contacts=(
["Alice"]="alice@gmail.com"
["Bob"]="(697) 955-5984"
["Eve"]="(245) 317-0117"
["Mallory"]="mallory@hotmail.com")

echo "${contacts["$1"]}"

The script stores contacts in the format of the Bash array declaration. This makes adding a new person to the list inconvenient. The user must know the Bash syntax. Otherwise, they can make a mistake when initializing an array element, which will break the script.

There is a solution to the problem of editing the contacts list. We can move the list into a separate text file. Then, the script would read it at startup. This way, we separate the data and code, which is widely considered a best practice in software development.

The following listing shows a possible format of the file with contacts. Let’s call it contacts.txt.

Alice=alice@gmail.com
Bob=(697) 955-5984
Eve=(245) 317-0117
Mallory=mallory@hotmail.com

Let’s write the script that reads this file. It is convenient to read the list of contacts directly into the associative array. This way, we will keep the searching mechanism over the list as effective as before.

When reading the file, we should handle its lines in the same manner. This means that we will repeat the same action several times. Therefore, we need a loop statement.

At the beginning of the loop, we don’t know the file size. Thus, we do not know the number of iterations to do. The while statement fits this case perfectly.

Why is the number of iterations unknown in advance?

This is because the script reads the file line by line. It cannot count the lines before it reads them all. There is an option to make two loops. Then, the first one counts the lines. The second loop processes them. However, this solution works slower and is less efficient.

We can call the built-in Bash command read for reading lines of the file. The command receives a string from the standard input stream. Then, it writes the string into the specified variable. We can pass the variable name as the parameter. Here is an example of calling read:

read var

Let’s run this command. Then, we type the string and press “Enter.” The read command writes our string into the var variable. We can call read without parameters. It writes the string into the reserved variable REPLY in this case.

Get hands-on with 1400+ tech skills courses.