Hampir semua pekerjaan di Linux — memindahkan file, mengelola proses, hingga menjalankan git atau docker — dilakukan lewat terminal. Mengetik perintah yang sama berulang kali memang membosankan dan rawan salah. Di sinilah bash scripting berperan: kamu bisa menyimpan serangkaian perintah ke dalam satu file, lalu menjalankannya kapan saja hanya dengan satu perintah. Dalam panduan ini kamu akan belajar bash dari nol, mulai dari variabel dan kondisi sampai membuat script backup otomatis yang benar-benar berguna.

Apa Itu Bash dan Kenapa Kamu Perlu Menguasainya?

Bash (Bourne Again Shell) adalah shell bawaan di hampir semua distribusi Linux dan macOS. Shell adalah program yang menerjemahkan perintah yang kamu ketik di terminal agar bisa dijalankan oleh sistem operasi. Ketika kamu menulis urutan perintah ke dalam sebuah file teks dan mengeksekusinya, itulah yang disebut shell script.

Menguasai bash sangat penting jika kamu sering menyentuh server, karena mayoritas otomatisasi di Linux berjalan lewat script: job cron, proses build di CI/CD, hingga ENTRYPOINT pada container Docker. Bash juga jadi fondasi sebelum kamu mendalami otomatisasi pipeline seperti GitHub Actions.

Persiapan: Editor Teks dan Shebang

Kamu hanya butuh terminal dan editor teks — bisa nano, vim, atau VS Code. Setiap script bash dimulai dengan baris shebang #!/usr/bin/env bash yang memberi tahu sistem shell apa yang dipakai untuk menjalankan file ini. Simpan file dengan ekstensi .sh, lalu beri izin eksekusi dengan chmod +x.

Ada baiknya kamu menyimpan script di dalam repository Git agar setiap perubahan terlacak dan mudah dibagikan ke tim.

Membuat Script Pertama: Hello World

Buat file bernama hello.sh dengan isi berikut:

bash
#!/usr/bin/env bash
echo "Halo, BengkelKode!"

Simpan, beri izin eksekusi, lalu jalankan:

bash
chmod +x hello.sh
./hello.sh

Kamu akan melihat tulisan Halo, BengkelKode! tercetak di layar. Selamat — itu script bash pertamamu!

Pasang shellcheck (lewat apt install shellcheck atau brew install shellcheck) untuk memeriksa kesalahan sintaks dan praktik buruk pada script-mu secara otomatis sebelum dijalankan.

Variabel dan Substitusi Perintah

Variabel menyimpan nilai dengan tanda = tanpa spasi di sekitarnya, lalu dipanggil dengan tanda $. Kamu juga bisa menyisipkan hasil sebuah perintah ke dalam string menggunakan $( ) — ini disebut command substitution.

bash
#!/usr/bin/env bash
nama="Dunia"
situs="BengkelKode"
echo "Halo, $nama! Selamat datang di $situs."
echo "Direktori saat ini: $(pwd)"

Perhatikan bagaimana $nama dan $situs digantikan oleh nilainya, sedangkan $(pwd) digantikan oleh hasil perintah pwd.

Jangan beri spasi di sekitar tanda =. Penulisan nama = "Dunia" akan dianggap sebagai perintah, bukan penugasan variabel, dan memunculkan error command not found.

Menerima Input Pengguna

Perintah read menunggu input dari keyboard dan menyimpannya ke variabel. Flag -p dipakai untuk menampilkan teks prompt sebelum menunggu input.

bash
#!/usr/bin/env bash
read -p "Siapa namamu? " nama
echo "Halo, $nama! Senang bertemu denganmu."

Saat dijalankan, script akan berhenti sejenak sampai kamu mengetik sesuatu dan menekan Enter, lalu menyapa kamu dengan nama tersebut.

Argumen dan Exit Code

Script bisa menerima argumen dari baris perintah: $1 adalah argumen pertama, $2 kedua, dan seterusnya. Sintaks ${1:-Dunia} memakai nilai Dunia sebagai default ketika argumen tidak diberikan.

bash
#!/usr/bin/env bash
# Penggunaan: ./args.sh Alice
nama="${1:-Dunia}"
echo "Halo, $nama!"
exit 0

Setiap script juga punya exit code: 0 berarti sukses, angka selain 0 berarti gagal. Kamu bisa memeriksanya lewat variabel $?. Nilai ini penting karena sistem otomatisasi seperti cron dan CI menggunakannya untuk mengetahui apakah script berhasil dijalankan.

Kondisional: if, elif, else

Struktur if memutuskan alur berdasarkan kondisi. Perhatikan bahwa kondisi ditulis di dalam kurung siku [ ] dengan spasi di kedua sisinya.

bash
#!/usr/bin/env bash
umur=18
if [ "$umur" -lt 13 ]; then
  echo "Anak-anak"
elif [ "$umur" -lt 18 ]; then
  echo "Remaja"
else
  echo "Dewasa"
fi

Untuk memeriksa file dan direktori, gunakan operator seperti -f (file ada), -d (direktori ada), dan -z (string kosong):

bash
#!/usr/bin/env bash
if [ -f "config.env" ]; then
  echo "File konfigurasi ditemukan."
else
  echo "File config.env tidak ada."
fi

Pada bash modern, kamu bisa memakai [[ ]] sebagai pengganti [ ]. Kurung ganda lebih aman (variabel tidak perlu dikutip) dan mendukung operator seperti =~ untuk pencocokan regex.

Perulangan: for dan while

Perulangan for mengiterasi sebuah daftar nilai satu per satu:

bash
#!/usr/bin/env bash
for lang in Python JavaScript Go; do
  echo "Saya sedang belajar $lang"
done

Untuk rentang angka, pakai ekspansi kurung kurawal {1..5}:

bash
#!/usr/bin/env bash
for i in {1..5}; do
  echo "Iterasi ke-$i"
done

Perulangan while berjalan selama kondisinya masih benar. (Kebalikannya adalah until, yang berjalan selama kondisinya masih salah.)

bash
#!/usr/bin/env bash
counter=1
while [ "$counter" -le 5 ]; do
  echo "Hitungan: $counter"
  counter=$((counter + 1))
done

Fungsi

Fungsi mengelompokkan kode agar bisa dipakai ulang. Argumen di dalam fungsi diakses dengan $1, $2, dan seterusnya — bukan nama parameter seperti di bahasa pemrograman lain.

bash
#!/usr/bin/env bash
sapa() {
  echo "Halo, $1!"
}

sapa "Alice"
sapa "Bob"

Studi Kasus: Script Backup Otomatis

Sekarang mari rangkai semua yang sudah dipelajari menjadi script yang nyata: mencadangkan sebuah direktori ke file .tar.gz dengan nama yang memuat tanggal dan jam.

bash
#!/usr/bin/env bash
set -euo pipefail

# Direktori yang akan di-backup (argumen pertama, default: $HOME/Documents)
SOURCE_DIR="${1:-$HOME/Documents}"
BACKUP_DIR="${BACKUP_DIR:-$HOME/backups}"
DATE=$(date +%Y-%m-%d_%H%M%S)
OUTPUT="$BACKUP_DIR/backup-$DATE.tar.gz"

mkdir -p "$BACKUP_DIR"

echo "Membuat backup dari $SOURCE_DIR ..."
tar -czf "$OUTPUT" -C "$SOURCE_DIR" .

if [ -f "$OUTPUT" ]; then
  echo "Backup berhasil: $OUTPUT"
  ls -lh "$OUTPUT"
else
  echo "Backup gagal." >&2
  exit 1
fi

Ada beberapa hal penting di sini. set -euo pipefail membuat script langsung berhenti saat ada perintah gagal (-e), memperlakukan variabel yang belum di-set sebagai error (-u), dan mencegah error di dalam pipe lolos begitu saja (-o pipefail). Ini praktik terbaik agar script tidak terus berjalan diam-diam setelah terjadi kesalahan.

Jalankan script-nya:

bash
chmod +x backup.sh
./backup.sh ~/Documents

Untuk menjadikannya otomatis, daftarkan di cron supaya berjalan setiap hari. Buka editor cron dengan crontab -e, lalu tambahkan baris berikut (backup setiap hari pukul 02.00):

bash
# Buka editor cron
crontab -e

# Tambahkan baris: backup setiap hari pukul 02.00
0 2 * * * /home/user/backup.sh /var/www/site

Ganti /home/user/backup.sh dan /var/www/site dengan path aslimu. Pastikan script sudah bisa dieksekusi (chmod +x) dan path-nya ditulis lengkap, karena cron tidak memuat environment shell interaktifmu.

Kesimpulan

Kamu baru saja mempelajari fondasi bash scripting: shebang, variabel, input, argumen, kondisi, perulangan, fungsi, dan praktik set -euo pipefail — lalu merangkainya menjadi script backup otomatis yang bisa langsung dipakai. Dengan dasar ini, kamu bisa mengotomatiskan hampir semua tugas repetitif di Linux.

Langkah selanjutnya: otomatiskan satu tugas harianmu sendiri. Setelah nyaman, perdalam otomatisasi CI/CD dan container agar script-mu berjalan otomatis di lingkungan produksi.

Apa perbedaan bash dengan sh?

sh adalah shell asli Unix dengan fitur yang lebih terbatas, sedangkan bash adalah penerusnya dengan fitur tambahan seperti array dan sintaks kurung ganda. Untuk script baru, sebaiknya gunakan shebang #!/usr/bin/env bash agar selalu memakai bash.

Apakah script bash bisa dijalankan di Windows?

Secara bawaan tidak. Tapi kamu bisa memakai WSL (Windows Subsystem for Linux), Git Bash, atau terminal di dalam container Docker. Di macOS dan Linux, bash sudah tersedia tanpa instalasi tambahan.

Bagaimana cara men-debug script bash?

Jalankan script dengan perintah bash -x script.sh untuk melihat setiap perintah yang dieksekusi, atau tambahkan set -x di bagian atas script. Alat seperti shellcheck juga membantu mendeteksi masalah umum sebelum script dijalankan.