Chapter 7: Handling Input and Output
Explore methods for handling input and output, including reading user input, redirecting output, and working with standard input, output, and error streams.
In this chapter, we’ll cover various techniques for managing input and output in Bash, including how to capture user input, redirect output to files, and work with standard streams to enhance the versatility of your scripts.
Reading User Input
To interact with users, Bash provides the read
command, which captures input from the keyboard and stores it in a variable:
# Example: Reading user input
echo "Enter your name:"
read name
echo "Hello, $name!"
In this example, read
captures the user’s input and stores it in the name
variable, which is then used to personalize the output.
Redirecting Output to Files
Bash allows you to redirect the output of commands to files using the >
and >>
operators:
>
: Overwrites the file with new content.>>
: Appends new content to the end of the file.
# Example: Redirecting output
echo "This is a test" > output.txt # Overwrites output.txt
echo "Appending text" >> output.txt # Appends to output.txt
In this example, output.txt
is created (or overwritten) with the first line and appended with the second line.
Working with Standard Streams
Bash scripts handle three standard streams: stdin
(standard input), stdout
(standard output), and stderr
(standard error). By redirecting these streams, you can control where input comes from and where output goes.
0
: Standard Input (stdin)1
: Standard Output (stdout)2
: Standard Error (stderr)
Redirecting Standard Error
To separate error messages from regular output, you can redirect stderr
(error stream) to a different file:
# Example: Redirecting stderr
ls /nonexistent 2> error.log
In this example, any error message from ls
will be redirected to error.log
, leaving the terminal output clean of error messages.
Combining Standard Output and Error
You can combine both stdout
and stderr
into a single file using >&
:
# Example: Combining stdout and stderr
ls /nonexistent /tmp > output.log 2>&1
Here, both successful and error messages are redirected to output.log
.
Using Pipes for Inter-Process Communication
The pipe operator (|
) passes the output of one command as input to another, enabling powerful command chaining:
# Example: Using pipes
ls -l | grep ".txt"
This command lists all files, but only shows those ending in .txt
by passing ls -l
output to grep
.
Reading from Files and Here Documents
Bash can read input from files or use "here documents" for multi-line input directly in the script.
Reading from a File
Use a while
loop to read each line from a file:
# Example: Reading a file line by line
while IFS= read -r line; do
echo "Line: $line"
done < input.txt
This example reads each line from input.txt
and prints it to the terminal.
Using Here Documents
Here documents allow you to provide multiple lines of input within the script:
# Example: Here document
cat <
The text between <<EOF
and EOF
is treated as input to the cat
command.
Summary and Next Steps
In this chapter, we explored handling input and output, including capturing user input, redirecting output, and managing standard streams. In the next chapter, we’ll dive into error handling and debugging techniques to ensure your scripts run smoothly and handle potential issues gracefully.