Read user input in shell script
Getting user input is important for creating interactive and dynamic shell scripts so that they execute as user wants. For example, a file reader shell script which reads the file location from the user or a menu based script which performs actions based on user input.
read
command that can be used to capture user input and store it in variable. Syntax for reading user input in a shell script is given below read message
Above command will wait for the user to enter characters and will keep on reading till enter key(or new line) is pressed. User input will be stored in a variable named message
.
If you want to prompt a message to the user asking to provide input, then use -p
option as
read -p “Enter a message ” message
echo “$message”
This will print a message on the terminal asking the user to enter some input and will store the input in message
variable. Next it will print the value stored in message
variable.
Output of above script will be
Enter a message Hello there!!
Hello there!!
If you want to display a message without using -p
option, then you need to use echo
command to first display the message and then read the user input as shown below
echo “Enter a message”
read message
read
command has many other options which are explained below but if you want to simply read an input from user, you can now do that.
For more advanced read
command tutorial, continue this article.
As stated above,
read
command is a builtin command on linux and unix systems to read input. It can be used to read from standard input(keyboard) or from a file also.It has many options which make it very powerful and flexible and this post will explain all those with examples.
Read with prompt
Display a message asking for user to enter input. Example,
read -p “Enter your age: ” age
echo “Age is” $age “years”
Output will be
Age is 15 years
Read a password
Use read
command with -s
option standing for silent. It will not display the characters entered by the user. Example,
read -p “Enter password ” -s password
echo “Password is ” $password
Notice the use of multiple options in the same read command. Also, -p
option should be immediately followed by the prompt to be displayed.
Output of above code will be
Password is
Note that the characters entered by the user are not displayed on the terminal.
Split entered string on some character
Suppose you want to read some key-value pairs from the user in key=value format and extract key and value separately from the input, use -a
option of read
to split the input and assign it to array. Array elements will start at 0 index. Example,
IFS=”=”
# split input on “=” and assign each token to the array
read -a array -p “Enter key-value: ” input
echo “Key is ${array[0]}”
echo “Value is ${array[1]}”
where IFS is Field separator on which read command will split the input. Here, we set it to “=” since we need to break the input on this character.
Key is website
Value is codippa
Remember that it will not work if you do not set IFS to the character on which the input should be split.
Reading only fixed number of characters
Sometimes you want to limit the size of input from the user, such as when asking for a permission Y/N, we want the user to enter only 1 character.
Rather than applying a check on the size of input, read command provides -n
option that will automatically terminate reading after the specified number of characters. Example,
# read only 1 character
read -n 1 “Would you like to continue (y/n)? ” continue
# check for valid input character
if [[ !($continue== ‘y’) && !( $continue== ‘n’ ) ]];then
echo -e “\nInvalid option”
else
echo -e “\nOk..”
fi
Output will be
Invalid option
Would you like to continue (y/n)? y
Ok..
read
command will automatically terminate after you enter the first character, you don’t even need to press enter after the specified number of characters have been read.
Reading from a file
read
command can also be used to read from a file directly by using file descriptors. Its -u
option followed by a file descriptor performs the read operation. Example,
# assign a file descriptor to a file
exec 4< ./data.txt
# read from the file descriptor and assign it to variable
read -u 4 line
# display variable value
echo $line
Below table summarizes all the above read command options along with some additional options for quick reference.
Option | Description | Example |
---|---|---|
-a | Stores the words in an array variable which follows -a. Default separator is a space but you can change it by setting IFS value. | read -a arr |
-d | Specifies the delimiter till which read should keep on accepting input. Default delimiter is newline or till enter is pressed. | read -d “q” input Will keep on reading till q is pressed. input is a variable where user input will be stored |
-e | ||
-i | This option followed by some text is used as an initial input(or some default value) from the user. This option can only be used with -e option and when -s option is not used. User can change the initial text. | read -e -i “My message is ” input Will display “My message is ” and then wait for user input |
-n | This option is followed by an integer which denotes the maximum number of characters that the command will read or till enter(or end of line) is pressed, whichever comes earlier. | read -n 20 input Will read max 20 characters or less than 20 if enter is pressed earlier and store it in input variable. |
-N | This option is similar to -n but it will ignore the newline character(or enter key) and will keep on reading till the number of characters have been read or timeout specified with -t option is reached. | read -N 20 input Will read max 20 characters and store it in input variable. |
-p | Used for displaying a message to the user. This option is followed by a string which is displayed before the user can enter his input. | read -p “Enter your name ” name Displays the above message and waits for user input. |
-r | Stands for raw input. Will read backslashes(\) as text rather than escape characters. | read -p “Enter a message ” -r info Displays “Enter a message” prompt and waits for user input. |
-s | Stands for silent input. It will hide the characters input by the user. Used for taking password or secret inputs from the user. | read -p “Enter password” -s code |
-t | Represents a timeout. Followed by an integer which is the number of seconds that the command should wait for the user to input a value. | read -t 10 input Wait for 10 seconds for user to enter characters. |
-u | Specifies the file descriptor from where read should accept input. Default is standard input(or keyboard). | read -u 4 line Read a line from the file denoted by a file descriptor |
As you can see, read
command is a simple to use but it becomes very powerful with all its options.
That is all on read
command in linux. Do click the clap button below if you liked the article.