Home > Environment & Utility > read

read: Reading User Input

The read command reads a single line from standard input (stdin) or a specified file descriptor and stores it in one or more variables. It is commonly used in shell scripting to get user input or process file content. This command is built into most shells, including Bash and Zsh.

Overview

read plays a crucial role when a script needs to obtain information from the user or read data from a pipe or file and assign it to variables. Various options allow for fine-grained control over input methods and processing.

Key Features

  • Reads a single line of input from the user
  • Stores the input into variables
  • Displays a prompt message
  • Sets a timeout for input
  • Handles sensitive input like passwords by hiding it

Key Options

The main options for the read command help control how user input is processed in various ways.

Input Control

Generated command:

Try combining the commands.

Description:

`read` Executes the command.

Combine the above options to virtually execute commands with AI.

Usage Examples

Learn how to process user input through various examples of the read command.

Basic Input Reading

read name
echo "Hello, $name!"

Reads a name from the user and stores it in a variable.

Reading Input with a Prompt

read -p "What is your favorite color? " color
echo "You like $color."

Prompts the user with a question and reads their answer.

Setting a Timeout

echo "Enter your name within 5 seconds:"
read -t 5 name
name=${name:-"Guest"}
echo "Hello, $name!"

Proceeds with a default value if no input is received within 5 seconds.

Hiding Password Input

read -s -p "Enter your password: " password
echo "\nPassword entered."

Ensures that typed characters are not displayed on the screen.

Splitting Input into Multiple Variables

read -p "Enter your name and age (e.g., John Doe 30): " name age
echo "Name: $name, Age: $age"

Stores space-separated input into multiple variables sequentially.

Reading Line by Line from a File

echo -e "Line 1\nLine 2\nLine 3" > example.txt
while IFS= read -r line; do
  echo "Read line: $line"
done < example.txt
rm example.txt

A common pattern for reading and processing file content line by line.

Tips & Precautions

Tips and precautions for using the read command more effectively and safely.

Importance of Using read -r

The `read -r` option prevents backslash (\) characters from being interpreted as escape characters, ensuring that the input string is stored literally in the variable. It is highly recommended to always use this option, especially when receiving input that might contain special characters like file paths, to prevent data loss or malfunctions.

  • Example (Backslash Handling): echo 'C:\Users\User' | read path; echo $path -> C:UsersUser (backslash removed) echo 'C:\Users\User' | read -r path; echo $path -> C:\Users\User (backslash preserved)

Utilizing the IFS Variable

The IFS (Internal Field Separator) variable defines the delimiters used by the read command to split input into words. The default value includes space, tab, and newline characters. By changing IFS, you can easily parse data delimited by commas (,), colons (:), etc.

  • Example (Comma Delimited): echo "apple,banana,cherry" | IFS=, read -r fruit1 fruit2 fruit3 echo "First fruit: $fruit1, Second fruit: $fruit2"

Security Precaution: Avoid Using with eval

Directly using user-provided input with the `eval` command is extremely dangerous from a security perspective. It can create vulnerabilities that allow malicious users to execute arbitrary code. User input should always be treated as untrusted data and rigorously validated when necessary.

  • Bad Example: read -p "Enter a command: " cmd eval "$cmd" # Never do this!

while read Pattern for File Processing

The `while IFS= read -r line` pattern is very robust and efficient for reading and processing file content line by line. `IFS=` prevents leading/trailing whitespace removal, and `-r` prevents backslash interpretation, ensuring accurate reading of file content.

  • Common Usage: while IFS= read -r line; do # The $line variable will contain each line of the file. echo "Processing: $line" done < your_file.txt

Same category commands