Linux Shell Scripting Complete Course: From Zero to Hero
Table of Contents
- Introduction
- Getting Started
- Variables & Data Types
- User Input & Output
- Conditional Statements
- Loops
- Functions
- Arrays
- String Manipulation
- File Operations
- Process Management
- Error Handling & Debugging
- Real-World Projects
- Best Practices
1. Introduction
What is Shell Scripting?
A shell script is a text file containing a sequence of commands for a Unix-based operating system. It automates repetitive tasks, manages system operations, and creates powerful workflows.
Why Learn Shell Scripting?
- Automation: Schedule backups, log rotation, system monitoring
- Efficiency: Reduce manual tasks from hours to seconds
- DevOps Essential: CI/CD pipelines, deployment scripts, infrastructure management
- System Administration: User management, service control, security audits
- Portability: Scripts run on Linux, macOS, and WSL
Popular Shells
| Shell | Description | Path |
|---|---|---|
| Bash | Bourne Again SHell (default on most systems) | /bin/bash |
| Sh | Original Bourne Shell | /bin/sh |
| Zsh | Z Shell (macOS default) | /bin/zsh |
| Fish | Friendly Interactive Shell | /usr/bin/fish |
2. Getting Started
Your First Script
1[object Object], 2,[object Object], 3,[object Object], ,[object Object],
Save as: hello.sh
Make it executable:
1[object Object], +x hello.sh
Run it:
1./hello.sh
The Shebang (#!)
The shebang tells the system which interpreter to use:
1[object Object], 2,[object Object], 3,[object Object],
Script Execution Methods
1[object Object], 2./script.sh 3 4,[object Object], 5bash script.sh 6sh script.sh 7 8,[object Object], 9,[object Object], script.sh 10. script.sh
3. Variables & Data Types
Declaring Variables
1[object Object], 2 3,[object Object], 4name=,[object Object], 5age=25 6pi=3.14159 7 8,[object Object], 9,[object Object], ,[object Object], 10,[object Object], ,[object Object],
Variable Rules
- Must start with letter or underscore
- Case-sensitive (
Name≠name) - No spaces around
= - Convention: UPPERCASE for constants
Variable Types
1[object Object], 2 3,[object Object], 4website=,[object Object], 5 6,[object Object], 7,[object Object],=1500 8 9,[object Object], 10,[object Object], COMPANY=,[object Object], 11 12,[object Object], 13,[object Object], ,[object Object], 14 15,[object Object], 16,[object Object], count=10
Special Variables
| Variable | Meaning |
|---|---|
$0 | Script name |
$1 to $9 | Positional arguments |
$# | Number of arguments |
$* | All arguments as single word |
$@ | All arguments as separate strings |
$? | Exit status of last command |
$$ | Process ID of current shell |
$! | Process ID of last background job |
1[object Object], 2,[object Object], ,[object Object], 3,[object Object], ,[object Object], 4,[object Object], ,[object Object], 5,[object Object], ,[object Object], 6,[object Object], ,[object Object],
Environment Variables
1[object Object], 2 3,[object Object], ,[object Object], 4,[object Object], ,[object Object], 5,[object Object], ,[object Object], 6,[object Object], ,[object Object], 7,[object Object], ,[object Object], 8 9,[object Object], 10,[object Object], MY_VAR=,[object Object],
Command Substitution
1[object Object], 2 3,[object Object], 4date_now=`,[object Object],` 5 6,[object Object], 7current_date=$(,[object Object], +%Y-%m-%d) 8files_count=$(,[object Object], | ,[object Object], -l) 9 10,[object Object], ,[object Object], 11,[object Object], ,[object Object],
Arithmetic Operations
1[object Object], 2 3a=10 4b=3 5 6,[object Object], 7,[object Object], $((a + b)) ,[object Object], 8,[object Object], $((a - b)) ,[object Object], 9,[object Object], $((a * b)) ,[object Object], 10,[object Object], $((a / b)) ,[object Object], 11,[object Object], $((a % b)) ,[object Object], 12 13,[object Object], 14,[object Object], $(,[object Object], ,[object Object], + ,[object Object],) 15 16,[object Object], 17,[object Object], result=a+b 18,[object Object], ,[object Object], 19 20,[object Object], 21,[object Object], ,[object Object], | bc ,[object Object],
4. User Input & Output
Reading Input
1[object Object], 2 3,[object Object], 4,[object Object], ,[object Object], 5,[object Object], name 6,[object Object], ,[object Object], 7 8,[object Object], 9,[object Object], -p ,[object Object], age 10,[object Object], ,[object Object], 11 12,[object Object], 13,[object Object], -sp ,[object Object], password 14,[object Object], ,[object Object], 15 16,[object Object], 17,[object Object], -p ,[object Object], first last 18,[object Object], ,[object Object], 19 20,[object Object], 21,[object Object], -a colors -p ,[object Object], 22,[object Object], ,[object Object], 23 24,[object Object], 25,[object Object], -t 5 -p ,[object Object], answer 26 27,[object Object], 28,[object Object], -n 1 -p ,[object Object],
Output Commands
1[object Object], 2 3,[object Object], 4,[object Object], ,[object Object], 5 6,[object Object], 7,[object Object], -n ,[object Object], ,[object Object], 8,[object Object], -e ,[object Object], ,[object Object], 9 10,[object Object], 11,[object Object], ,[object Object], ,[object Object], 25 12,[object Object], ,[object Object], 3.14159 13 14,[object Object], 15,[object Object], > output.txt ,[object Object], 16,[object Object], >> output.txt ,[object Object], 17,[object Object], < input.txt ,[object Object], 18,[object Object], 2> errors.log ,[object Object], 19,[object Object], > all.log 2>&1 ,[object Object], 20,[object Object], &> all.log ,[object Object],
Here Documents & Here Strings
1[object Object], 2 3,[object Object], 4,[object Object], << ,[object Object], 5 6,[object Object], 7,[object Object], << ,[object Object], 8,[object Object], won,[object Object]
5. Conditional Statements
If-Else Statements
1[object Object], 2 3,[object Object], -p ,[object Object], num 4 5,[object Object], [ ,[object Object], -gt 10 ]; ,[object Object], 6 ,[object Object], ,[object Object], 7,[object Object], [ ,[object Object], -eq 10 ]; ,[object Object], 8 ,[object Object], ,[object Object], 9,[object Object], 10 ,[object Object], ,[object Object], 11,[object Object],
Test Operators
Numeric Comparisons:
| Operator | Meaning |
|---|---|
-eq | Equal |
-ne | Not equal |
-gt | Greater than |
-ge | Greater than or equal |
-lt | Less than |
-le | Less than or equal |
String Comparisons:
| Operator | Meaning |
|---|---|
= or == | Equal |
!= | Not equal |
-z | Zero length |
-n | Non-zero length |
File Tests:
| Operator | Meaning |
|---|---|
-e | File exists |
-f | Regular file |
-d | Directory |
-r | Readable |
-w | Writable |
-x | Executable |
-s | Non-empty file |
-L | Symbolic link |
1[object Object], 2 3file=,[object Object], 4 5,[object Object], [ -e ,[object Object], ]; ,[object Object], 6 ,[object Object], ,[object Object], 7 8 ,[object Object], [ -r ,[object Object], ]; ,[object Object], 9 ,[object Object], ,[object Object], 10 ,[object Object], 11 12 ,[object Object], [ -w ,[object Object], ]; ,[object Object], 13 ,[object Object], ,[object Object], 14 ,[object Object], 15,[object Object], 16 17,[object Object], 18name=,[object Object], 19,[object Object], [ ,[object Object], = ,[object Object], ]; ,[object Object], 20 ,[object Object], ,[object Object], 21,[object Object], 22 23,[object Object], 24,[object Object], [ -z ,[object Object], ]; ,[object Object], 25 ,[object Object], ,[object Object], 26,[object Object],
Logical Operators
1[object Object], 2 3,[object Object], 4,[object Object], [ -f ,[object Object], ] && [ -r ,[object Object], ]; ,[object Object], 5 ,[object Object], ,[object Object], 6,[object Object], 7 8,[object Object], 9,[object Object], [ ,[object Object], = ,[object Object], ] || [ ,[object Object], = ,[object Object], ]; ,[object Object], 10 ,[object Object], ,[object Object], 11,[object Object], 12 13,[object Object], 14,[object Object], [ ! -d ,[object Object], ]; ,[object Object], 15 ,[object Object], ,[object Object], 16,[object Object], 17 18,[object Object], 19,[object Object], [[ -f ,[object Object], && ( ,[object Object], = ,[object Object], || ,[object Object], = ,[object Object], ) ]]; ,[object Object], 20 ,[object Object], ,[object Object], 21,[object Object],
Case Statements
1[object Object], 2 3,[object Object], -p ,[object Object], os 4 5,[object Object], ,[object Object], ,[object Object], 6 linux|Linux|LINUX) 7 ,[object Object], ,[object Object], 8 ;; 9 mac|Mac|MAC|darwin) 10 ,[object Object], ,[object Object], 11 ;; 12 windows|Windows|WINDOWS) 13 ,[object Object], ,[object Object], 14 ;; 15 *) 16 ,[object Object], ,[object Object], 17 ;; 18,[object Object],
Double Brackets [[ ]]
1[object Object], 2 3,[object Object], 4,[object Object], [[ ,[object Object], == *,[object Object],* ]]; ,[object Object], 5 ,[object Object], ,[object Object], 6,[object Object], 7 8,[object Object], 9,[object Object], [[ ,[object Object], =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; ,[object Object], 10 ,[object Object], ,[object Object], 11,[object Object], 12 13,[object Object], 14,[object Object], [[ ,[object Object], == admin ]]; ,[object Object], 15 ,[object Object], ,[object Object], 16,[object Object],
6. Loops
For Loop
1[object Object], 2 3,[object Object], 4,[object Object], i ,[object Object], 1 2 3 4 5; ,[object Object], 5 ,[object Object], ,[object Object], 6,[object Object], 7 8,[object Object], 9,[object Object], i ,[object Object], {1..5}; ,[object Object], 10 ,[object Object], ,[object Object], 11,[object Object], 12 13,[object Object], 14,[object Object], i ,[object Object], {0..10..2}; ,[object Object], 15 ,[object Object], ,[object Object], 16,[object Object], 17 18,[object Object], 19,[object Object], ((i=,[object Object],; i<,[object Object],; i++)); ,[object Object], 20 ,[object Object], ,[object Object], 21,[object Object], 22 23,[object Object], 24,[object Object], file ,[object Object], *.txt; ,[object Object], 25 ,[object Object], ,[object Object], 26,[object Object], 27 28,[object Object], 29fruits=(,[object Object], ,[object Object], ,[object Object],) 30,[object Object], fruit ,[object Object], ,[object Object],; ,[object Object], 31 ,[object Object], ,[object Object], 32,[object Object], 33 34,[object Object], 35,[object Object], user ,[object Object], $(,[object Object], /etc/passwd | ,[object Object], -d: -f1); ,[object Object], 36 ,[object Object], ,[object Object], 37,[object Object],
While Loop
1[object Object], 2 3,[object Object], 4counter=1 5,[object Object], [ ,[object Object], -le 5 ]; ,[object Object], 6 ,[object Object], ,[object Object], 7 ((counter++)) 8,[object Object], 9 10,[object Object], 11,[object Object], ,[object Object], line; ,[object Object], 12 ,[object Object], ,[object Object], 13,[object Object], < input.txt 14 15,[object Object], 16,[object Object], ,[object Object],; ,[object Object], 17 ,[object Object], -p ,[object Object], input 18 ,[object Object], [ ,[object Object], = ,[object Object], ]; ,[object Object], 19 ,[object Object], 20 ,[object Object], 21 ,[object Object], ,[object Object], 22,[object Object], 23 24,[object Object], 25,[object Object], -l | ,[object Object], ,[object Object], line; ,[object Object], 26 ,[object Object], ,[object Object], 27,[object Object],
Until Loop
1[object Object], 2 3,[object Object], 4count=1 5,[object Object], [ ,[object Object], -gt 5 ]; ,[object Object], 6 ,[object Object], ,[object Object], 7 ((count++)) 8,[object Object],
Loop Control
1[object Object], 2 3,[object Object], 4,[object Object], i ,[object Object], {1..10}; ,[object Object], 5 ,[object Object], [ ,[object Object], -eq 5 ]; ,[object Object], 6 ,[object Object], 7 ,[object Object], 8 ,[object Object], ,[object Object], 9,[object Object], 10 11,[object Object], 12,[object Object], i ,[object Object], {1..10}; ,[object Object], 13 ,[object Object], [ $((i % ,[object Object],)) -eq 0 ]; ,[object Object], 14 ,[object Object], 15 ,[object Object], 16 ,[object Object], ,[object Object], 17,[object Object], 18 19,[object Object], 20,[object Object], choice ,[object Object], ,[object Object], ,[object Object], ,[object Object], ,[object Object],; ,[object Object], 21 ,[object Object], ,[object Object], ,[object Object], 22 Start) ,[object Object], ,[object Object],; ,[object Object], ;; 23 Stop) ,[object Object], ,[object Object],; ,[object Object], ;; 24 Restart) ,[object Object], ,[object Object],; ,[object Object], ;; 25 Exit) ,[object Object], 0 ;; 26 *) ,[object Object], ,[object Object], ;; 27 ,[object Object], 28,[object Object],
7. Functions
Defining Functions
1[object Object], 2 3,[object Object], 4,[object Object], ,[object Object],() { 5 ,[object Object], ,[object Object], 6} 7 8,[object Object], 9,[object Object],() { 10 ,[object Object], ,[object Object], 11} 12 13,[object Object], 14greet ,[object Object], 15greet ,[object Object],
Function with Return Value
1[object Object], 2 3,[object Object], 4,[object Object],() { 5 ,[object Object], a=,[object Object], 6 ,[object Object], b=,[object Object], 7 ,[object Object], $((a + b)) ,[object Object], 8} 9 10result=$(add_numbers 10 20) 11,[object Object], ,[object Object], 12 13,[object Object], 14,[object Object],() { 15 ,[object Object], [ -f ,[object Object], ]; ,[object Object], 16 ,[object Object], 0 ,[object Object], 17 ,[object Object], 18 ,[object Object], 1 ,[object Object], 19 ,[object Object], 20} 21 22,[object Object], check_file ,[object Object],; ,[object Object], 23 ,[object Object], ,[object Object], 24,[object Object], 25 ,[object Object], ,[object Object], 26,[object Object],
Function Variables Scope
1[object Object], 2 3global_var=,[object Object], 4 5,[object Object],() { 6 ,[object Object], local_var=,[object Object], 7 ,[object Object], ,[object Object], 8 ,[object Object], ,[object Object], 9} 10 11my_function 12,[object Object], ,[object Object], 13,[object Object], ,[object Object], ,[object Object],
Function with Multiple Arguments
1[object Object], 2 3,[object Object],() { 4 ,[object Object], username=,[object Object], 5 ,[object Object], shell=,[object Object], ,[object Object], 6 ,[object Object], home=,[object Object], 7 8 ,[object Object], ,[object Object], 9 ,[object Object], ,[object Object], 10 ,[object Object], ,[object Object], 11} 12 13create_user ,[object Object], ,[object Object], 14create_user ,[object Object], ,[object Object],
8. Arrays
Indexed Arrays
1[object Object], 2 3,[object Object], 4fruits=(,[object Object], ,[object Object], ,[object Object], ,[object Object],) 5 6,[object Object], 7,[object Object], ,[object Object], 8,[object Object], ,[object Object], 9 10,[object Object], 11,[object Object], ,[object Object], 12,[object Object], ,[object Object], 13 14,[object Object], 15,[object Object], ,[object Object], 16 17,[object Object], 18fruits+=(,[object Object],) 19 20,[object Object], 21,[object Object], fruits[1] 22 23,[object Object], 24,[object Object], fruit ,[object Object], ,[object Object],; ,[object Object], 25 ,[object Object], ,[object Object], 26,[object Object], 27 28,[object Object], 29,[object Object], i ,[object Object], ,[object Object],; ,[object Object], 30 ,[object Object], ,[object Object], 31,[object Object], 32 33,[object Object], 34,[object Object], ,[object Object],
Associative Arrays (Bash 4+)
1[object Object], 2 3,[object Object], -A user 4 5user[name]=,[object Object], 6user[age]=30 7user[city]=,[object Object], 8 9,[object Object], ,[object Object], 10,[object Object], ,[object Object], 11 12,[object Object], 13,[object Object], key ,[object Object], ,[object Object],; ,[object Object], 14 ,[object Object], ,[object Object], 15,[object Object], 16 17,[object Object], 18,[object Object], [ -v ,[object Object], ]; ,[object Object], 19 ,[object Object], ,[object Object], 20,[object Object],
9. String Manipulation
String Operations
1[object Object], 2 3str=,[object Object], 4 5,[object Object], 6,[object Object], ,[object Object], 7 8,[object Object], 9,[object Object], ,[object Object], ,[object Object], 10,[object Object], ,[object Object], ,[object Object], 11 12,[object Object], 13,[object Object], ,[object Object], ,[object Object], 14 15,[object Object], 16,[object Object], ,[object Object], ,[object Object], 17 18,[object Object], 19,[object Object], ,[object Object], ,[object Object], 20 21,[object Object], 22,[object Object], ,[object Object], ,[object Object], 23 24,[object Object], 25,[object Object], ,[object Object], ,[object Object], 26 27,[object Object], 28str2=,[object Object], 29,[object Object], ,[object Object], ,[object Object], 30 31,[object Object], 32,[object Object], ,[object Object], ,[object Object], 33 34,[object Object], 35,[object Object], ,[object Object], ,[object Object], 36 37,[object Object], 38,[object Object], ,[object Object], ,[object Object], 39,[object Object], ,[object Object], ,[object Object], 40 41,[object Object], 42,[object Object], ,[object Object], ,[object Object], 43 44,[object Object], 45,[object Object], ,[object Object], ,[object Object],
Pattern Matching
1[object Object], 2 3filename=,[object Object], 4 5,[object Object], 6,[object Object], [[ ,[object Object], == *.pdf ]]; ,[object Object], 7 ,[object Object], ,[object Object], 8,[object Object], 9 10,[object Object], 11name=,[object Object], 12,[object Object], ,[object Object], 13 14,[object Object], 15ext=,[object Object], 16,[object Object], ,[object Object],
10. File Operations
Reading Files
1[object Object], 2 3,[object Object], 4content=$(,[object Object], file.txt) 5 6,[object Object], 7,[object Object], IFS= ,[object Object], -r line; ,[object Object], 8 ,[object Object], ,[object Object], 9,[object Object], < file.txt 10 11,[object Object], 12line_num=1 13,[object Object], IFS= ,[object Object], -r line; ,[object Object], 14 ,[object Object], ,[object Object], 15 ((line_num++)) 16,[object Object], < file.txt 17 18,[object Object], 19sed -n ,[object Object], file.txt 20 21,[object Object], 22,[object Object], -n 1 file.txt 23 24,[object Object], 25,[object Object], -n 1 file.txt
Writing Files
1[object Object], 2 3,[object Object], 4,[object Object], ,[object Object], > file.txt 5 6,[object Object], 7,[object Object], ,[object Object], >> file.txt 8 9,[object Object], 10,[object Object], > file.txt << ,[object Object], 11 12,[object Object], 13,[object Object], ,[object Object], ,[object Object], 25 > output.txt
File Manipulation
1[object Object], 2 3,[object Object], 4,[object Object], [ -f ,[object Object], ]; ,[object Object], 5 ,[object Object], ,[object Object], 6,[object Object], 7 8,[object Object], 9,[object Object], -p /path/to/new/dir 10 11,[object Object], 12,[object Object], source.txt dest.txt 13 14,[object Object], 15,[object Object], old.txt new.txt 16 17,[object Object], 18,[object Object], file.txt 19,[object Object], -r directory/ 20 21,[object Object], 22find /var/log -name ,[object Object], -mtime +7 23 24,[object Object], 25grep ,[object Object], file.txt 26grep -r ,[object Object], directory/ 27grep -i ,[object Object], file.txt ,[object Object], 28grep -n ,[object Object], file.txt ,[object Object], 29 30,[object Object], 31sed -i ,[object Object], file.txt 32 33,[object Object], 34,[object Object], -l file.txt ,[object Object], 35,[object Object], -w file.txt ,[object Object], 36,[object Object], -c file.txt ,[object Object],
Working with CSV/JSON
1[object Object], 2 3,[object Object], 4,[object Object], IFS=,[object Object], ,[object Object], -r name age city; ,[object Object], 5 ,[object Object], ,[object Object], 6,[object Object], < data.csv 7 8,[object Object], 9,[object Object], 10,[object Object],
11. Process Management
Running Commands
1[object Object], 2 3,[object Object], 4long_running_task & 5pid=$! 6,[object Object], ,[object Object], 7,[object Object], ,[object Object], 8,[object Object], ,[object Object], 9 10,[object Object], 11,[object Object], 30 ./script.sh 12 13,[object Object], 14output=$(,[object Object], 2>&1) 15 16,[object Object], 17,[object Object], ,[object Object],; ,[object Object], 18 ,[object Object], ,[object Object], 19,[object Object], 20 ,[object Object], ,[object Object], 21,[object Object],
Process Control
1[object Object], 2 3,[object Object], 4ps aux 5 6,[object Object], 7pgrep -f ,[object Object], 8 9,[object Object], 10,[object Object], PID 11,[object Object], -9 PID ,[object Object], 12pkill process_name 13 14,[object Object], 15,[object Object], PID 16 17,[object Object], 18,[object Object], ,[object Object], INT TERM 19 20,[object Object], 21,[object Object],() { 22 ,[object Object], ,[object Object], 23 ,[object Object], -f temp.* 24} 25,[object Object], cleanup EXIT
Job Control
1[object Object], 2 3,[object Object], 4./script.sh & 5 6,[object Object], 7,[object Object], 8 9,[object Object], 10,[object Object], %1 11 12,[object Object], 13,[object Object], %1 14 15,[object Object], 16,[object Object], %1
12. Error Handling & Debugging
Exit Codes
1[object Object], 2 3,[object Object], 4,[object Object], /nonexistent 5,[object Object], ,[object Object], 6 7,[object Object], 8,[object Object], -e 9command1 10command2 ,[object Object], 11 12,[object Object], 13,[object Object], -u 14,[object Object], ,[object Object], ,[object Object], 15 16,[object Object], 17,[object Object], -o pipefail 18,[object Object], file.txt | grep ,[object Object], ,[object Object], 19 20,[object Object], 21,[object Object], -euo pipefail
Error Handling Patterns
1[object Object], 2,[object Object], -euo pipefail 3 4,[object Object], 5,[object Object], ! ,[object Object], -p /some/dir; ,[object Object], 6 ,[object Object], ,[object Object], >&2 7 ,[object Object], 1 8,[object Object], 9 10,[object Object], 11,[object Object], -p /some/dir || { ,[object Object], ,[object Object],; ,[object Object], 1; } 12 13,[object Object], 14,[object Object],() { 15 ,[object Object], src=,[object Object], 16 ,[object Object], dest=,[object Object], 17 18 ,[object Object], [ ! -f ,[object Object], ]; ,[object Object], 19 ,[object Object], ,[object Object], >&2 20 ,[object Object], 1 21 ,[object Object], 22 23 ,[object Object], ,[object Object], ,[object Object], || { 24 ,[object Object], ,[object Object], >&2 25 ,[object Object], 1 26 } 27 28 ,[object Object], ,[object Object], 29}
Debugging
1[object Object], 2 3,[object Object], 4,[object Object], -x 5,[object Object], 6,[object Object], +x 7 8,[object Object], 9 10,[object Object], 11,[object Object], -v 12 13,[object Object], 14,[object Object], ,[object Object], >&2 15 16,[object Object], 17,[object Object],() { 18 ,[object Object], ,[object Object], | ,[object Object], -a script.log 19} 20 21,[object Object], ,[object Object], 22,[object Object], ,[object Object],
Trap for Cleanup
1[object Object], 2,[object Object], -euo pipefail 3 4TEMP_DIR=$(,[object Object], -d) 5,[object Object], ,[object Object], EXIT 6 7,[object Object], ,[object Object], 8,[object Object], 9 10,[object Object],
13. Real-World Projects
Project 1: System Information Script
1[object Object], 2,[object Object], 3 4,[object Object], -euo pipefail 5 6HOSTNAME=$(hostname) 7OS=$(,[object Object], /etc/os-release && ,[object Object], ,[object Object],) 8KERNEL=$(,[object Object], -r) 9UPTIME=$(,[object Object], -p) 10CPU=$(,[object Object],) 11MEM_TOTAL=$(free -h | awk ,[object Object],) 12MEM_USED=$(free -h | awk ,[object Object],) 13DISK_USAGE=$(,[object Object], -h / | awk ,[object Object],) 14IP=$(hostname -I | awk ,[object Object],) 15 16,[object Object], << ,[object Object],
Project 2: Log Analyzer
1[object Object], 2,[object Object], 3 4LOG_FILE=,[object Object], 5REPORT_FILE=,[object Object], 6 7,[object Object], [ ! -f ,[object Object], ]; ,[object Object], 8 ,[object Object], ,[object Object], >&2 9 ,[object Object], 1 10,[object Object], 11 12,[object Object], ,[object Object], 13,[object Object], ,[object Object], 14 15{ 16 ,[object Object], ,[object Object], 17 ,[object Object], ,[object Object], 18 ,[object Object], ,[object Object], 19 20 ,[object Object], ,[object Object], 21 ,[object Object], -l < ,[object Object], 22 23 ,[object Object], ,[object Object], 24 ,[object Object], ,[object Object], 25 awk ,[object Object], ,[object Object], | ,[object Object], | ,[object Object], -c | ,[object Object], -rn | ,[object Object], -10 26 27 ,[object Object], ,[object Object], 28 ,[object Object], ,[object Object], 29 awk ,[object Object], ,[object Object], | ,[object Object], | ,[object Object], -c | ,[object Object], -rn 30 31 ,[object Object], ,[object Object], 32 ,[object Object], ,[object Object], 33 awk ,[object Object], ,[object Object], | ,[object Object], | ,[object Object], -c | ,[object Object], -rn | ,[object Object], -10 34 35 ,[object Object], ,[object Object], 36 ,[object Object], ,[object Object], 37 awk ,[object Object], ,[object Object], | ,[object Object], | ,[object Object], -c | ,[object Object], -rn | ,[object Object], -10 38 39} > ,[object Object], 40 41,[object Object], ,[object Object],
Project 3: Backup Script
1[object Object], 2,[object Object], 3 4,[object Object], -euo pipefail 5 6,[object Object], 7SOURCE_DIR=,[object Object], 8BACKUP_DIR=,[object Object], 9RETENTION_DAYS=7 10DATE=$(,[object Object], +%Y%m%d_%H%M%S) 11BACKUP_NAME=,[object Object], 12LOG_FILE=,[object Object], 13 14,[object Object], 15,[object Object],() { 16 ,[object Object], ,[object Object], | ,[object Object], -a ,[object Object], 17} 18 19,[object Object],() { 20 ,[object Object], ,[object Object], 21 find ,[object Object], -name ,[object Object], -mtime +,[object Object], -delete 22 ,[object Object], ,[object Object], 23} 24 25,[object Object], 26,[object Object],() { 27 ,[object Object], ,[object Object], 28 ,[object Object], ,[object Object], 29 ,[object Object], ,[object Object], 30 31 ,[object Object], 32 ,[object Object], -p ,[object Object], 33 34 ,[object Object], 35 ,[object Object], [ ! -d ,[object Object], ]; ,[object Object], 36 ,[object Object], ,[object Object], 37 ,[object Object], 1 38 ,[object Object], 39 40 ,[object Object], 41 ,[object Object], tar -czf ,[object Object], -C ,[object Object], ,[object Object],; ,[object Object], 42 ,[object Object], ,[object Object], 43 ,[object Object], ,[object Object], 44 ,[object Object], 45 ,[object Object], ,[object Object], 46 ,[object Object], 1 47 ,[object Object], 48 49 ,[object Object], 50 cleanup_old_backups 51 52 ,[object Object], ,[object Object], 53} 54 55,[object Object], 56,[object Object], ,[object Object], INT TERM 57 58main ,[object Object],
Project 4: User Management Script
1[object Object], 2,[object Object], 3 4,[object Object], -euo pipefail 5 6SCRIPT_NAME=$(,[object Object], ,[object Object],) 7 8,[object Object],() { 9 ,[object Object], << ,[object Object], 10} 11 12,[object Object],() { 13 ,[object Object], [ ,[object Object], -ne 0 ]; ,[object Object], 14 ,[object Object], ,[object Object], >&2 15 ,[object Object], 1 16 ,[object Object], 17} 18 19,[object Object],() { 20 ,[object Object], username=,[object Object], 21 22 ,[object Object], ,[object Object], ,[object Object], &>/dev/null; ,[object Object], 23 ,[object Object], ,[object Object], 24 ,[object Object], 1 25 ,[object Object], 26 27 ,[object Object], -sp ,[object Object], password 28 ,[object Object], 29 30 useradd -m -s /bin/bash ,[object Object], 31 ,[object Object], ,[object Object], | chpasswd 32 33 ,[object Object], ,[object Object], 34} 35 36,[object Object],() { 37 ,[object Object], username=,[object Object], 38 39 ,[object Object], ! ,[object Object], ,[object Object], &>/dev/null; ,[object Object], 40 ,[object Object], ,[object Object], 41 ,[object Object], 1 42 ,[object Object], 43 44 ,[object Object], -p ,[object Object], confirm 45 ,[object Object], [[ ,[object Object], =~ ^[Yy]$ ]]; ,[object Object], 46 userdel -r ,[object Object], 47 ,[object Object], ,[object Object], 48 ,[object Object], 49 ,[object Object], ,[object Object], 50 ,[object Object], 51} 52 53,[object Object],() { 54 ,[object Object], ,[object Object], 55 awk -F: ,[object Object], /etc/passwd 56} 57 58,[object Object],() { 59 ,[object Object], username=,[object Object], 60 usermod -L ,[object Object], 61 ,[object Object], ,[object Object], 62} 63 64,[object Object],() { 65 ,[object Object], username=,[object Object], 66 usermod -U ,[object Object], 67 ,[object Object], ,[object Object], 68} 69 70,[object Object], 71,[object Object], ,[object Object], ,[object Object], 72 add) 73 check_root 74 [ -z ,[object Object], ] && { usage; ,[object Object], 1; } 75 add_user ,[object Object], 76 ;; 77 delete) 78 check_root 79 [ -z ,[object Object], ] && { usage; ,[object Object], 1; } 80 delete_user ,[object Object], 81 ;; 82 list) 83 list_users 84 ;; 85 lock) 86 check_root 87 [ -z ,[object Object], ] && { usage; ,[object Object], 1; } 88 lock_user ,[object Object], 89 ;; 90 unlock) 91 check_root 92 [ -z ,[object Object], ] && { usage; ,[object Object], 1; } 93 unlock_user ,[object Object], 94 ;; 95 *) 96 usage 97 ,[object Object], 1 98 ;; 99,[object Object],
Project 5: Website Health Monitor
1[object Object], 2,[object Object], 3 4,[object Object], -euo pipefail 5 6,[object Object], 7URLS_FILE=,[object Object], 8INTERVAL=,[object Object], ,[object Object], 9LOG_FILE=,[object Object], 10ALERT_EMAIL=,[object Object], 11TIMEOUT=10 12 13,[object Object], 14RED=,[object Object], 15GREEN=,[object Object], 16YELLOW=,[object Object], 17NC=,[object Object], 18 19,[object Object],() { 20 ,[object Object], ,[object Object], | ,[object Object], -a ,[object Object], 21} 22 23,[object Object],() { 24 ,[object Object], url=,[object Object], 25 ,[object Object], status_code 26 ,[object Object], response_time 27 28 status_code=$(curl -o /dev/null -s -w ,[object Object], --max-time ,[object Object], ,[object Object], || ,[object Object], ,[object Object],) 29 response_time=$(curl -o /dev/null -s -w ,[object Object], --max-time ,[object Object], ,[object Object], || ,[object Object], ,[object Object],) 30 31 ,[object Object], [ ,[object Object], -eq 200 ]; ,[object Object], 32 ,[object Object], -e ,[object Object], 33 ,[object Object], ,[object Object], 34 ,[object Object], [ ,[object Object], -ge 500 ]; ,[object Object], 35 ,[object Object], -e ,[object Object], 36 ,[object Object], ,[object Object], 37 ,[object Object], 38 ,[object Object], [ ,[object Object], -eq ,[object Object], ]; ,[object Object], 39 ,[object Object], -e ,[object Object], 40 ,[object Object], ,[object Object], 41 ,[object Object], 42 ,[object Object], 43 ,[object Object], -e ,[object Object], 44 ,[object Object], ,[object Object], 45 ,[object Object], 46} 47 48,[object Object],() { 49 ,[object Object], url=,[object Object], 50 ,[object Object], message=,[object Object], 51 52 ,[object Object], ,[object Object], -v mail &>/dev/null; ,[object Object], 53 ,[object Object], ,[object Object], | mail -s ,[object Object], ,[object Object], 54 ,[object Object], 55} 56 57,[object Object], 58,[object Object], [ ! -f ,[object Object], ]; ,[object Object], 59 ,[object Object], ,[object Object], >&2 60 ,[object Object], ,[object Object], 61 ,[object Object], 1 62,[object Object], 63 64,[object Object], ,[object Object], 65,[object Object], ,[object Object], 66,[object Object], ,[object Object], 67,[object Object], ,[object Object], 68,[object Object], ,[object Object], 69 70,[object Object], ,[object Object],; ,[object Object], 71 ,[object Object], ,[object Object], 72 73 ,[object Object], IFS= ,[object Object], -r url; ,[object Object], 74 [ -z ,[object Object], ] && ,[object Object], 75 [[ ,[object Object], =~ ^# ]] && ,[object Object], 76 check_url ,[object Object], 77 ,[object Object], < ,[object Object], 78 79 ,[object Object], ,[object Object], 80 ,[object Object], ,[object Object], 81,[object Object],
14. Best Practices
1. Always Use Shebang
1[object Object], 2,[object Object], 3,[object Object],
2. Enable Strict Mode
1[object Object], 2,[object Object], -euo pipefail 3IFS=$,[object Object],
3. Quote Variables
1[object Object], 2,[object Object], -rf ,[object Object],/ 3 4,[object Object], 5,[object Object], -rf ,[object Object],
4. Use Meaningful Names
1[object Object], 2x=10 3,[object Object],() { ... } 4 5,[object Object], 6max_retries=10 7,[object Object],() { ... }
5. Add Comments
1[object Object], 2,[object Object], 3,[object Object], 4,[object Object], 5,[object Object],
6. Validate Inputs
1[object Object], 2 3,[object Object], [ ,[object Object], -lt 1 ]; ,[object Object], 4 ,[object Object], ,[object Object], >&2 5 ,[object Object], 1 6,[object Object], 7 8,[object Object], [ ! -f ,[object Object], ]; ,[object Object], 9 ,[object Object], ,[object Object], >&2 10 ,[object Object], 1 11,[object Object],
7. Use Functions
1[object Object], 2 3,[object Object], 4,[object Object],() { ... } 5,[object Object],() { ... } 6,[object Object],() { ... } 7 8,[object Object],() { 9 backup_database 10 backup_files 11 cleanup_old_backups 12} 13 14main ,[object Object],
8. Handle Errors Gracefully
1[object Object], 2 3,[object Object], || { 4 ,[object Object], ,[object Object], >&2 5 ,[object Object], 1 6}
9. Use Temporary Files Safely
1[object Object], 2 3,[object Object], 4TMPFILE=$(,[object Object],) 5,[object Object], ,[object Object], EXIT 6 7,[object Object], 8TMPFILE=/tmp/myscript.tmp ,[object Object],
10. Make Scripts Portable
1[object Object], 2 3,[object Object], 4,[object Object], -v program &>/dev/null || { 5 ,[object Object], ,[object Object], >&2 6 ,[object Object], 1 7} 8 9,[object Object], 10,[object Object],
Quick Reference Cheat Sheet
VARIABLES
var="value" # Assign
$var or ${var} # Access
${var:-default} # Default value
${var:=default} # Assign default
${var:?error} # Error if unset
${#var} # Length
CONDITIONALS
[ $a -eq $b ] # Numeric equal
[ "$a" = "$b" ] # String equal
[ -f file ] # File exists
[ -d dir ] # Directory exists
[[ $a == pattern ]] # Pattern match
LOOPS
for i in 1 2 3; do ... done
for ((i=0; i<5; i++)); do ... done
while [ condition ]; do ... done
until [ condition ]; do ... done
FUNCTIONS
myfunc() { echo $1; }
myfunc "arg"
USEFUL COMMANDS
cut, awk, sed, grep, find, xargs
sort, uniq, wc, head, tail
date, sleep, read, printf
Conclusion
You now have a complete understanding of Linux shell scripting! Start with simple scripts, practice daily, and gradually build complex automation tools. Remember:
- Practice with real-world tasks
- Read other people's scripts on GitHub
- Automate everything you do more than twice
- Share your scripts and get feedback
Happy scripting! 🐧
Published on Tech3Space | Linux Shell Scripting Complete Course