Table of Contents
- What is Bash Scripting?
- Setting Up Your Environment
- Your First Bash Script: Hello World
- Anatomy of a Bash Script
- Variables in Bash
- Input and Output Handling
- Control Structures: Conditionals and Loops
- Functions in Bash
- Error Handling
- Best Practices for Bash Scripting
- Conclusion
- References
What is Bash Scripting?
Bash is a shell—a program that acts as an interface between the user and the operating system kernel. When you type commands into a terminal (like ls, cd, or mkdir), Bash interprets and executes them. A Bash script is a text file containing a sequence of these commands, which Bash can run as a single program.
Why Bash Scripting?
- Automation: Automate repetitive tasks (e.g., backups, log rotation, file renaming).
- Portability: Bash scripts work on any Unix-like system (Linux, macOS, WSL on Windows).
- Simplicity: No need for complex compilers—scripts are plain text and run directly.
- Integration: Combine system tools (e.g.,
grep,awk,sed) to build powerful workflows.
Setting Up Your Environment
Before diving into scripting, ensure your environment is ready. Here’s what you need:
1. Check if Bash is Installed
Most Linux and macOS systems come with Bash preinstalled. To verify:
bash --version
You’ll see output like GNU bash, version 5.1.16(1)-release if installed.
2. For Windows Users
Use Windows Subsystem for Linux (WSL) or Git Bash (part of Git for Windows) to run Bash scripts.
3. Text Editor
Choose a code editor to write scripts. Popular options:
- VS Code: Free, with Bash syntax highlighting (install the “Bash IDE” extension).
- Nano: Simple, terminal-based editor (preinstalled on most systems).
- Vim/Neovim: Powerful, terminal-based (steep learning curve but worth it).
Your First Bash Script: Hello World
Let’s write a simple script to print “Hello, World!” to the terminal.
Step 1: Create the Script File
Open your text editor and create a new file named hello_world.sh. The .sh extension is conventional (not required but helpful for clarity).
Step 2: Add Script Content
Type the following:
#!/bin/bash
# This is a comment: My first Bash script
echo "Hello, World!"
Step 3: Make the Script Executable
By default, text files aren’t executable. Use chmod to grant execute permissions:
chmod +x hello_world.sh
Step 4: Run the Script
Execute the script with:
./hello_world.sh
Output:
Hello, World!
Breaking It Down:
#!/bin/bash: The shebang line tells the system to run this script with Bash. Always start scripts with this!# This is a comment: Comments explain code and are ignored by Bash. Use them liberally.echo "Hello, World!":echoprints text to the terminal.
Anatomy of a Bash Script
Now that you’ve run your first script, let’s formalize its structure:
1. Shebang Line (#!/bin/bash)
The shebang (#!) specifies the interpreter. Always start scripts with this to ensure they run with Bash (not another shell like sh or zsh).
2. Comments (#)
Comments start with # and help others (and future you) understand the code:
#!/bin/bash
# Purpose: Backup important files
# Author: Your Name
# Date: 2024-01-01
3. Commands
The body of the script contains Bash commands (e.g., echo, cd, mkdir). Commands run sequentially, top to bottom.
4. Execution Permissions
As shown earlier, use chmod +x script.sh to make the script executable.
Variables in Bash
Variables store data for reuse. Bash has no strict data types—variables hold strings by default, but can also store numbers.
Declaring Variables
Use variable_name=value (no spaces around =!):
name="Alice"
age=30
Accessing Variables
Prefix the variable name with $:
echo "Name: $name" # Output: Name: Alice
echo "Age: $age" # Output: Age: 30
For clarity (e.g., when concatenating with text), wrap variables in ${}:
echo "Hello, ${name}!" # Output: Hello, Alice!
Environment Variables
Bash provides built-in variables for system info. Common ones:
$HOME: Your home directory (e.g.,/home/alice).$PATH: Directories where the system looks for executable programs.$USER: Current username.$PWD: Current working directory.$?: Exit code of the last command (0 = success, non-zero = error).
Example:
echo "Home: $HOME" # Output: Home: /home/alice
echo "User: $USER" # Output: User: alice
Input and Output Handling
Bash scripts interact with users and files through input/output (I/O) operations.
1. Output with echo
echo prints text to the terminal. Use quotes for spaces or special characters:
echo "Hello, World!"
echo 'Single quotes preserve $variables' # Output: Single quotes preserve $variables
2. Input with read
read captures user input from the terminal. Use -p to add a prompt:
#!/bin/bash
read -p "Enter your name: " name # Prompt user for input
echo "Hello, $name!"
Run it:
Enter your name: Bob
Hello, Bob!
3. Command Substitution
Capture the output of a command into a variable using $(command) or backticks (`command`):
current_date=$(date +%Y-%m-%d) # Store current date in YYYY-MM-DD format
echo "Today is $current_date" # Output: Today is 2024-01-01
4. Redirection
Save command output to a file with > (overwrite) or >> (append):
echo "Hello, File!" > output.txt # Overwrites output.txt
echo "Another line" >> output.txt # Appends to output.txt
Read a file with cat:
cat output.txt # Output: Hello, File! Another line
5. Pipes (|)
Send output of one command as input to another with |:
ls -l | grep ".txt" # List files and filter for .txt files
Control Structures: Conditionals and Loops
Control structures let you add logic to scripts (e.g., “if X, do Y” or “repeat Z times”).
1. Conditionals (if, elif, else)
Check conditions and run code accordingly. Syntax:
if [ condition ]; then
# Code if condition is true
elif [ another_condition ]; then
# Code if first condition is false, second is true
else
# Code if all conditions are false
fi # Ends the if block (reverse of "if")
Key Operators:
- String comparison:
=,!=(e.g.,[ "$name" = "Alice" ]). - Numeric comparison:
-eq(equal),-ne(not equal),-gt(greater than),-lt(less than),-ge(>=),-le(<=) (e.g.,[ $age -gt 18 ]). - File checks:
-f(file exists),-d(directory exists),-x(executable) (e.g.,[ -f "script.sh" ]).
Example: Check if a user is an adult:
#!/bin/bash
read -p "Enter your age: " age
if [ $age -ge 18 ]; then
echo "You are an adult."
else
echo "You are a minor."
fi
2. Loops
for Loop: Iterate Over Lists
Syntax:
for item in list; do
# Code for each item
done
Example: Loop through files in a directory:
#!/bin/bash
echo "Text files in current directory:"
for file in *.txt; do
echo "- $file"
done
while Loop: Repeat Until Condition Fails
Syntax:
while [ condition ]; do
# Code to repeat
done
Example: Countdown from 5:
#!/bin/bash
count=5
while [ $count -gt 0 ]; do
echo $count
count=$((count - 1)) # Decrement count
sleep 1 # Wait 1 second
done
echo "Blast off!"
Functions in Bash
Functions group reusable code into named blocks. Syntax:
function_name() {
# Code here
# Use $1, $2, etc., to access parameters
}
Example: Greet a user:
#!/bin/bash
greet() {
local name=$1 # "local" makes the variable local to the function
echo "Hello, $name!"
}
greet "Alice" # Call the function with "Alice" as $1
greet "Bob" # Output: Hello, Bob!
Error Handling
Prevent scripts from crashing unexpectedly with error handling.
1. Exit Codes
Every command returns an exit code: 0 (success), 1-255 (error). Check with $?:
ls non_existent_file
echo "Exit code: $?" # Output: Exit code: 2 (error)
2. set -e: Exit on Error
Add set -e at the top of your script to exit immediately if any command fails:
#!/bin/bash
set -e # Exit on error
ls non_existent_file # Script exits here (error code 2)
echo "This line won't run"
3. trap: Cleanup on Exit
Use trap to run commands when the script exits (e.g., delete temporary files):
#!/bin/bash
temp_file="temp.txt"
trap "rm -f $temp_file; echo 'Cleaned up temp file'" EXIT # Runs on exit
# Create temp file
echo "Temporary data" > $temp_file
echo "Script running..."
Best Practices for Bash Scripting
Write maintainable, robust scripts with these tips:
- Use meaningful names: Name scripts and variables clearly (e.g.,
backup_files.shinstead ofscript.sh). - Quote variables: Prevent errors with spaces in filenames:
"$variable"instead of$variable. - Test incrementally: Run small parts of the script first to catch bugs.
- Add comments: Explain “why” (not just “what”) the code does.
- Use
set -euo pipefail: Make scripts strict:-e: Exit on error.-u: Treat undefined variables as errors.-o pipefail: Exit if any command in a pipe fails.
- Avoid hard-coded paths: Use variables like
$HOMEinstead of/home/alice.
Conclusion
You now掌握 (master) the basics of Bash scripting! From writing your first “Hello World” to adding conditionals, loops, and functions, you have the tools to automate tasks and build powerful workflows.
Practice is key—try scripting everyday tasks: backup your photos, organize downloads, or monitor system resources. As you progress, explore advanced topics like arrays, regex, and integrating with other tools (e.g., awk, sed).
Happy scripting!
References
- GNU Bash Manual
- Bash Scripting Tutorial (ShellScript.net)
- Bash Hackers Wiki
- ShellCheck (Linter for Bash scripts)
- Bash Cheat Sheet (Devhints)