Developer Workflow · #18 of 19

Shell Scripting

Bash Basics

What is a Shell Script?

A shell script is a text file containing commands that run sequentially. Automate anything you do in the terminal!


Your First Script

Create a file hello.sh:

#!/bin/bash
echo "Hello, World!"

The #! (shebang) tells the system which interpreter to use.

Make it Executable

chmod +x hello.sh
./hello.sh               # Run it!

Or run directly with bash:

bash hello.sh

Variables

#!/bin/bash
NAME="Alice"
echo "Hello, $NAME"
echo "Hello, ${NAME}!"   # Braces for clarity

# Command substitution
TODAY=$(date +%Y-%m-%d)
FILES=$(ls | wc -l)
echo "Today is $TODAY, we have $FILES files"

Special Variables

Variable Meaning
$0 Script name
$1, $2... Arguments
$# Number of arguments
$@ All arguments
$? Exit status of last command
$$ Current process ID

User Input

#!/bin/bash
echo "What's your name?"
read NAME
echo "Hello, $NAME!"

# One-liner with prompt
read -p "Enter your age: " AGE
echo "You are $AGE years old"

Conditionals

if/then/else

#!/bin/bash
if [ -f /etc/passwd ]; then
    echo "File exists"
else
    echo "File not found"
fi

Test Operators

File tests:

Test True if…
-f file File exists (regular file)
-d dir Directory exists
-e path Path exists
-r file File is readable
-w file File is writable
-x file File is executable

String tests:

Test True if…
-z "$str" String is empty
-n "$str" String is not empty
"$a" = "$b" Strings are equal
"$a" != "$b" Strings differ

Numeric tests:

Test True if…
$a -eq $b Equal
$a -ne $b Not equal
$a -lt $b Less than
$a -gt $b Greater than
$a -le $b Less or equal
$a -ge $b Greater or equal

Loops

for Loop

#!/bin/bash
for i in 1 2 3 4 5; do
    echo "Number: $i"
done

# Range
for i in {1..10}; do
    echo "Count: $i"
done

# Files
for file in *.txt; do
    echo "Processing $file"
done

while Loop

#!/bin/bash
COUNT=0
while [ $COUNT -lt 5 ]; do
    echo "Count: $COUNT"
    COUNT=$((COUNT + 1))
done

Reading Lines

#!/bin/bash
while read line; do
    echo "Line: $line"
done < /etc/passwd

Functions

#!/bin/bash
greet() {
    echo "Hello, $1!"
}

greet "Alice"
greet "Bob"

# With return value
is_even() {
    if [ $(($1 % 2)) -eq 0 ]; then
        return 0   # True
    else
        return 1   # False
    fi
}

if is_even 4; then
    echo "4 is even"
fi

Practical Examples

Backup Script

#!/bin/bash
DATE=$(date +%Y%m%d)
tar -czf backup_$DATE.tar.gz /home/$USER/Documents
echo "Backup created: backup_$DATE.tar.gz"

System Info

#!/bin/bash
echo "=== System Info ==="
echo "Hostname: $(hostname)"
echo "Uptime: $(uptime -p)"
echo "Disk Usage: $(df -h / | tail -1 | awk '{print $5}')"
echo "Memory: $(free -h | grep Mem | awk '{print $3"/"$2}')"

Try It!

Practice scripting in the terminal:

Exercises:

  1. Create a simple script: echo '#!/bin/bash' > test.sh
  2. Add a command: echo 'echo "Hello"' >> test.sh
  3. Make executable: chmod +x test.sh
  4. Run it: ./test.sh

Try it in the terminal

A sandboxed shell with this lesson’s commands. Type help to see what’s available.

bash — try it