Panduan Menulis Bash Script untuk Pemula
Panduan Pemula Menulis Bash Script: Syntax Dasar dan Best Practices
Hai, pernah nggak kamu merasa kesal karena harus menjalankan urutan perintah yang sama berulang-ulang setiap hari? Atau mungkin kamu punya task rutin yang membutuhkan beberapa langkah dan sering lupa urutannya? Atau ingin melakukan backup otomatis tapi nggak tahu harus mulai dari mana?
Kalau iya, saatnya kamu belajar bash scripting. Ini adalah skill superpower yang akan mengubah kamu dari user biasa menjadi power user. Bayangkan bisa membuat "asisten virtual" yang melakukan tugas-tugas membosankan untuk kamu, tanpa salah dan tanpa keluhan!
Apa Itu Bash Script dan Kenapa Harus Belajar?
Bash script adalah file teks yang berisi serangkaian perintah bash yang dieksekusi secara berurutan. Ini seperti membuat resep memasak untuk komputer - kamu tulis langkah-langkahnya, komputer yang menjalankan.
Alasan belajar bash script:
· Automation: Otomatiskan tugas repetitif
· Consistency: Hasil yang konsisten setiap waktu
· Time Saving: Hemat waktu untuk task rutin
· Error Reduction: Minimalkan human error
· Productivity: Tingkatkan produktivitas secara signifikan
Membuat Bash Script Pertama: "Hello World"
Mari mulai dengan script sederhana. Buat file baru:
```bash
nano hello.sh
```
Isi dengan:
```bash
#!/bin/bash
# Ini adalah komentar
echo "Hello World!"
echo "Hari ini adalah: $(date)"
```
Penjelasan baris per baris:
· #!/bin/bash - Shebang, memberi tahu sistem interpreter mana yang digunakan
· # Ini adalah komentar - Komentar, tidak dieksekusi
· echo "Hello World!" - Print teks ke layar
· echo "Hari ini adalah: $(date)" - Print teks dengan command substitution
Membuat file executable:
```bash
chmod +x hello.sh
```
Menjalankan script:
```bash
./hello.sh
```
Struktur Dasar Bash Script
1. Variabel dan Data Types
Mendefinisikan variabel:
```bash
#!/bin/bash
# Variabel string
nama="Budi Santoso"
perusahaan="Tech Corp"
# Variabel number
umur=25
gaji=5000000
# Variabel dari command output
waktu_sekarang=$(date)
directory_sekarang=$(pwd)
```
Menggunakan variabel:
```bash
echo "Nama: $nama"
echo "Perusahaan: ${perusahaan}" # Alternatif syntax
echo "Umur: $umur tahun"
echo "Waktu: $waktu_sekarang"
```
Variabel system (built-in):
```bash
echo "Script name: $0" # Nama script
echo "First argument: $1" # Argument pertama
echo "All arguments: $@" # Semua argument
echo "Number of arguments: $#" # Jumlah argument
echo "Process ID: $$" # PID script
echo "Exit status: $?" # Exit status terakhir
```
2. Input dari User
Menggunakan argument:
```bash
#!/bin/bash
echo "Hello, $1!"
echo "Your age is: $2"
```
Penggunaan: ./script.sh John 25
Input saat runtime:
```bash
#!/bin/bash
echo -n "Enter your name: "
read nama
echo -n "Enter your age: "
read umur
echo "Hello $nama, you are $umur years old!"
```
3. Conditional Statements (If-Else)
Bentuk dasar:
```bash
if [ condition ]; then
# perintah jika true
else
# perintah jika false
fi
```
Contoh perbandingan angka:
```bash
#!/bin/bash
echo -n "Enter a number: "
read angka
if [ $angka -gt 10 ]; then
echo "Number is greater than 10"
elif [ $angka -eq 10 ]; then
echo "Number is exactly 10"
else
echo "Number is less than 10"
fi
```
Operator perbandingan:
· -eq : equal (sama dengan)
· -ne : not equal (tidak sama)
· -gt : greater than (lebih besar)
· -lt : less than (lebih kecil)
· -ge : greater or equal (lebih besar atau sama)
· -le : less or equal (lebih kecil atau sama)
Contoh perbandingan string:
```bash
#!/bin/bash
echo -n "Enter your choice (yes/no): "
read pilihan
if [ "$pilihan" = "yes" ]; then
echo "You chose YES!"
elif [ "$pilihan" = "no" ]; then
echo "You chose NO!"
else
echo "Invalid choice!"
fi
```
4. Loops (Perulangan)
For loop:
```bash
#!/bin/bash
# Loop melalui list
for i in 1 2 3 4 5; do
echo "Number: $i"
done
# Loop melalui range
for i in {1..5}; do
echo "Count: $i"
done
# Loop melalui files
for file in *.txt; do
echo "Processing: $file"
done
```
While loop:
```bash
#!/bin/bash
counter=1
while [ $counter -le 5 ]; do
echo "Counter: $counter"
((counter++))
done
```
Until loop:
```bash
#!/bin/bash
counter=1
until [ $counter -gt 5 ]; do
echo "Counter: $counter"
((counter++))
done
```
5. Functions
Mendefinisikan function:
```bash
#!/bin/bash
# Function sederhana
sapaan() {
echo "Hello, $1!"
echo "Selamat datang di $2"
}
# Function dengan return value
tambah() {
local hasil=$(( $1 + $2 ))
echo $hasil
}
# Memanggil function
sapaan "Budi" "Shell Scripting"
# Menangkap return value
result=$(tambah 5 3)
echo "Hasil penambahan: $result"
```
Script Practical untuk Sehari-hari
1. Script Backup Sederhana
```bash
#!/bin/bash
# backup-simple.sh
# Konfigurasi
BACKUP_DIR="/home/user/backups"
SOURCE_DIR="/home/user/documents"
BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S).tar.gz"
# Buat directory backup jika belum ada
mkdir -p "$BACKUP_DIR"
# Validasi source directory
if [ ! -d "$SOURCE_DIR" ]; then
echo "ERROR: Source directory $SOURCE_DIR tidak ditemukan!"
exit 1
fi
# Eksekusi backup
echo "Starting backup..."
tar -czf "$BACKUP_DIR/$BACKUP_NAME" "$SOURCE_DIR"
# Cek apakah backup sukses
if [ $? -eq 0 ]; then
echo "Backup sukses: $BACKUP_NAME"
echo "Size: $(du -h "$BACKUP_DIR/$BACKUP_NAME" | cut -f1)"
else
echo "Backup gagal!"
exit 1
fi
```
2. Script System Monitoring
```bash
#!/bin/bash
# system-check.sh
echo "=== SYSTEM STATUS CHECK ==="
echo "Waktu: $(date)"
echo
# Check disk space
echo "--- Disk Usage ---"
df -h | grep -v tmpfs
echo
# Check memory
echo "--- Memory Usage ---"
free -h
echo
# Check load average
echo "--- System Load ---"
uptime
echo
# Check logged in users
echo "--- Logged In Users ---"
who
echo
# Check services status
echo "--- Service Status ---"
services=("ssh" "nginx" "mysql")
for service in "${services[@]}"; do
if systemctl is-active --quiet "$service"; then
echo "✅ $service: RUNNING"
else
echo "❌ $service: STOPPED"
fi
done
```
3. Script File Management
```bash
#!/bin/bash
# file-organizer.sh
TARGET_DIR="${1:-.}" # Gunakan current directory jika tidak ada argument
if [ ! -d "$TARGET_DIR" ]; then
echo "Directory $TARGET_DIR tidak ditemukan!"
exit 1
fi
echo "Organizing files in: $TARGET_DIR"
# Buat directory kategori
mkdir -p "$TARGET_DIR/images" "$TARGET_DIR/documents" "$TARGET_DIR/archives"
# Pindahkan files berdasarkan ekstensi
for file in "$TARGET_DIR"/*; do
if [ -f "$file" ]; then
case "${file##*.}" in
jpg|jpeg|png|gif)
mv "$file" "$TARGET_DIR/images/"
echo "Moved: $file → images/"
;;
pdf|doc|docx|txt)
mv "$file" "$TARGET_DIR/documents/"
echo "Moved: $file → documents/"
;;
zip|tar|gz)
mv "$file" "$TARGET_DIR/archives/"
echo "Moved: $file → archives/"
;;
esac
fi
done
echo "File organization completed!"
```
Best Practices untuk Script yang Robust
1. Gunakan Shellcheck
Install shellcheck untuk analisis kode:
```bash
# Ubuntu/Debian
sudo apt install shellcheck
# CentOS/RHEL
sudo yum install shellcheck
```
Penggunaan: shellcheck script.sh
2. Always Use Quotes untuk Variabel
```bash
# Good
echo "$nama"
cp "$file1" "$file2"
# Bad (bisa error jika ada spaces)
echo $nama
cp $file1 $file2
```
3. Error Handling dengan set -e
```bash
#!/bin/bash
set -e # Exit immediately jika command gagal
# Script akan berhenti jika command ini gagal
rm important-file.txt
# Perintah ini tidak akan dijalankan jika di atas gagal
echo "Operation completed"
```
4. Gunakan Debug Mode saat Development
```bash
#!/bin/bash
set -x # Print setiap command sebelum dieksekusi
# Your code here
echo "Debug mode"
ls -l
```
5. Validasi Input
```bash
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <filename>"
exit 1
fi
if [ ! -f "$1" ]; then
echo "Error: File $1 tidak ditemukan!"
exit 1
fi
```
6. Gunakan Logging
```bash
#!/bin/bash
LOG_FILE="script.log"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
log "Script started"
# Your code here
log "Script completed"
```
Struktur Script yang Professional
```bash
#!/bin/bash
#
# Nama Script: system-backup.sh
# Description: Backup system files and databases
# Author: Your Name
# Version: 1.0
#
set -euo pipefail # Strict mode
# Configuration
readonly BACKUP_DIR="/backup"
readonly LOG_FILE="/var/log/backup.log"
readonly RETENTION_DAYS=7
# Functions
init_backup() {
local timestamp=$(date '+%Y%m%d_%H%M%S')
local backup_path="$BACKUP_DIR/backup_$timestamp"
mkdir -p "$backup_path"
echo "$backup_path"
}
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
cleanup_old_backups() {
log_message "Cleaning up backups older than $RETENTION_DAYS days"
find "$BACKUP_DIR" -name "backup_*" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; || true
}
# Main execution
main() {
log_message "=== Backup Started ==="
local backup_path
backup_path=$(init_backup)
log_message "Backup location: $backup_path"
# Backup commands here
# ...
cleanup_old_backups
log_message "=== Backup Completed ==="
}
# Error handler
handle_error() {
log_message "ERROR: Script failed at line $1"
exit 1
}
trap 'handle_error $LINENO' ERR
# Script entry point
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi
```
Debugging Tips
1. Gunakan set -x untuk tracing:
```bash
#!/bin/bash
set -x # Debug mode
# your code
set +x # Turn off debug
```
2. Check exit codes:
```bash
command
if [ $? -ne 0 ]; then
echo "Command failed!"
fi
```
3. Use verbose mode:
```bash
#!/bin/bash
set -e # Exit on error
set -u # Exit on undefined variables
set -o pipefail # Exit on pipe failures
```
Next Steps untuk Level Lanjutan
Setelah menguasai dasar, eksplorasi:
· Arrays: Untuk mengelola kumpulan data
· Associative arrays: Untuk key-value pairs
· Regular expressions: Untuk pattern matching
· Signal handling: Untuk menangani interrupts
· Parallel execution: Untuk mempercepat processing
Kesimpulan
Menulis bash script adalah skill yang akan mengubah cara kamu berinteraksi dengan Linux. Mulailah dengan script sederhana, practice regularly, dan secara bertahap bangun complexity.
Ingat principles penting:
· Start small: Buat script sederhana dulu
· Test thoroughly: Selalu test di environment aman
· Use best practices: Quotes, error handling, logging
· Document your code: Komentar yang jelas
· Keep learning: Terus eksplorasi features baru
Sekarang ambil task repetitif yang kamu lakukan hari ini, dan coba automasi dengan bash script. Happy scripting!
Reviewed by Sabila
on
19.49
Rating:
.png)
Tidak ada komentar: