Panduan

Skrip bash untuk pemula: skrip pertama, variabel, kondisi, perulangan, dan cron

Diperbarui: · Skillaria.Top

Skrip bash adalah berkas teks berisi perintah shell yang diawali baris shebang #!/bin/bash, diberi izin eksekusi dengan chmod +x, lalu dijalankan sebagai ./script.sh. Skrip menggunakan variabel, argumen $1 dan $2, kondisi if, perulangan for dan while, dan eksekusi terjadwal dikonfigurasi dengan crontab -e.

Skrip bash adalah berkas teks biasa berisi perintah yang biasanya Anda ketik satu per satu di terminal. Skrip diawali baris shebang #!/bin/bash, diberi izin eksekusi dengan chmod +x, dan dijalankan sebagai ./script.sh. Panduan skrip bash untuk pemula ini membahas dari baris pertama sampai eksekusi terjadwal: variabel, argumen, kondisi, perulangan, penanganan error, dan cron.

Skrip bash pertama dalam semenit

Buat berkas dengan editor apa pun, misalnya nano:

nano hello.sh
#!/bin/bash
# Skrip pertama: sapaan dan sedikit informasi sistem
echo "Halo, $USER!"
echo "Hari ini: $(date +%Y-%m-%d)"
echo "Anda berada di: $(pwd)"

Simpan (Ctrl+O, Enter, Ctrl+X), berikan izin eksekusi, lalu jalankan:

$ chmod +x hello.sh
$ ./hello.sh
Halo, alice!
Hari ini: 2026-10-12
Anda berada di: /home/alice

Baris yang diawali # adalah komentar. $(perintah) menyisipkan keluaran perintah langsung ke dalam kalimat.

Shebang: untuk apa baris pertama

Baris #!/bin/bash memberi tahu sistem interpreter mana yang harus menjalankan berkas. Tanpanya, skrip akan dijalankan oleh shell apa pun yang tersedia, dan di beberapa sistem /bin/sh bukanlah bash melainkan dash yang lebih sederhana, sehingga sebagian konstruksi tidak berfungsi.

Varian yang juga umum adalah #!/usr/bin/env bash: ia mencari bash di PATH, berguna jika bash tidak dipasang di /bin.

Cara menjalankan skrip dan mengapa ada ./

Ada dua cara:

  • ./hello.sh — membutuhkan shebang dan izin x. Awalan ./ wajib, karena direktori saat ini tidak termasuk dalam PATH.
  • bash hello.sh — tidak butuh izin eksekusi, karena interpreter ditulis secara eksplisit.

Jika tanpa ./ muncul command not found, dan tanpa chmod +x muncul Permission denied, itulah dua penyebab tersebut. Agar skrip Anda bisa dipanggil dengan nama dari mana saja, letakkan di ~/bin atau /usr/local/bin.

Variabel

Variabel ditetapkan tanpa spasi di sekitar =, dan dibaca dengan $:

#!/bin/bash
name="backup"
dir="/var/backups"
today=$(date +%F)

echo "Berkas: ${dir}/${name}-${today}.tar.gz"

Kurung kurawal memisahkan nama variabel dari teks di sekitarnya. Penulisan name = "backup" dengan spasi adalah kesalahan: bash akan mencoba menjalankan perintah bernama name.

Tanda kutip itu penting

Di dalam tanda kutip ganda variabel diganti dengan nilainya, di dalam tanda kutip tunggal tidak. Hampir selalu tulis variabel dalam tanda kutip ganda, karena nama berkas yang mengandung spasi akan terpecah menjadi dua argumen.

file="laporan saya.txt"
rm $file      # salah: akan mencoba menghapus "laporan" dan "saya.txt"
rm "$file"    # benar
echo '$HOME'  # menampilkan tulisan $HOME apa adanya
echo "$HOME"  # menampilkan /home/alice

Variabel lingkungan

Variabel seperti $HOME, $USER, dan $PATH disediakan oleh sistem. Variabel Anda sendiri bisa diteruskan ke proses anak dengan export. Pengaturan lingkungan yang permanen biasanya diletakkan di ~/.bashrc atau ~/.profile.

Argumen skrip

Nilai yang diberikan saat menjalankan skrip tersedia sebagai $1, $2, dan seterusnya.

VariabelIsinya
$0nama skrip
$1, $2…argumen pertama, kedua
$#jumlah argumen
"$@"semua argumen satu per satu
$?kode keluar perintah terakhir
$$PID skrip saat ini
#!/bin/bash
echo "Skrip $0 menerima $# argumen"
echo "Pertama: $1"
$ ./args.sh nginx 80
Skrip ./args.sh menerima 2 argumen
Pertama: nginx

Masukan dari pengguna dibaca dengan perintah read: read -p "Masukkan nama: " name.

Kondisi if

Setiap perintah mengembalikan kode keluar: 0 berarti berhasil, selain itu berarti gagal. Konstruksi if memeriksa kode tersebut. Untuk perbandingan dipakai [[ ... ]], dan spasi di dalam kurung itu wajib.

#!/bin/bash
if [[ $# -eq 0 ]]; then
    echo "Pemakaian: $0 <direktori>"
    exit 1
fi

if [[ -d "$1" ]]; then
    echo "Direktori $1 ada"
elif [[ -f "$1" ]]; then
    echo "$1 adalah berkas, bukan direktori"
else
    echo "$1 tidak ditemukan"
fi
PemeriksaanArti
-f fileberkas biasa ada
-d dirdirektori ada
-e pathpath ada
-x fileberkas dapat dieksekusi
-z "$var" / -n "$var"string kosong / tidak kosong
"$a" == "$b", !=perbandingan string
-eq -ne -lt -le -gt -geperbandingan angka

Anda juga bisa langsung memeriksa hasil sebuah perintah:

if systemctl is-active --quiet nginx; then
    echo "nginx berjalan"
else
    echo "nginx berhenti"
fi

Untuk banyak pilihan, case lebih rapi:

case "$1" in
    start)   echo "Menjalankan" ;;
    stop)    echo "Menghentikan" ;;
    *)       echo "Perintah tidak dikenal: $1"; exit 1 ;;
esac

Perulangan for dan while

for: mengulang daftar

for host in web1 web2 db1; do
    echo "Memeriksa $host"
    ping -c 1 -W 1 "$host" > /dev/null && echo "  dapat dijangkau" || echo "  tidak dapat dijangkau"
done

for file in /var/log/*.log; do
    echo "$file: $(wc -l < "$file") baris"
done

for i in {1..5}; do
    echo "Percobaan $i"
done

while: selama kondisi benar

Contoh klasik adalah membaca berkas baris demi baris:

while read -r user; do
    echo "Pengguna: $user"
done < users.txt

Dan menunggu sampai layanan siap:

count=0
until curl -sf http://localhost:8080/health > /dev/null; do
    count=$((count + 1))
    if [[ $count -ge 10 ]]; then
        echo "Layanan tidak naik"
        exit 1
    fi
    sleep 3
done
echo "Layanan siap"

Aritmetika di bash ditulis dalam kurung ganda: $((a + b)). Ia hanya bekerja dengan bilangan bulat.

Fungsi

Kode yang berulang dipisahkan ke dalam fungsi. Argumen di dalam fungsi adalah $1, $2, dan seterusnya, sedangkan local mencegah variabel bocor ke luar.

log() {
    local level="$1"; shift
    echo "$(date '+%F %T') [$level] $*"
}

log INFO "Mulai membuat cadangan"
log ERROR "Disk penuh"

Penanganan error: set -euo pipefail

Secara default bash tetap melanjutkan eksekusi setelah perintah gagal — sehingga skrip cadangan bisa berakhir "berhasil" padahal tidak menyalin apa pun. Di awal skrip lazim ditambahkan mode ketat:

#!/bin/bash
set -euo pipefail
  • -e — berhenti pada error pertama.
  • -u — variabel yang belum didefinisikan dianggap error (melindungi dari rm -rf "$DIR/" saat DIR kosong).
  • -o pipefail — pipeline dianggap gagal jika salah satu bagiannya gagal.

Untuk debugging, jalankan skrip dengan bash -x script.sh: bash akan mencetak setiap perintah sebelum dieksekusi. Untuk menemukan kesalahan umum sebelum menjalankan, gunakan shellcheck.

Contoh praktis: skrip cadangan

#!/bin/bash
set -euo pipefail

SRC="${1:-/var/www}"
DST="/var/backups/site"
KEEP_DAYS=7
STAMP=$(date +%F_%H-%M)

mkdir -p "$DST"
tar -czf "$DST/site-$STAMP.tar.gz" -C "$(dirname "$SRC")" "$(basename "$SRC")"
echo "Arsip dibuat: $DST/site-$STAMP.tar.gz"

# hapus arsip yang lebih tua dari KEEP_DAYS hari
find "$DST" -name "site-*.tar.gz" -mtime +"$KEEP_DAYS" -delete

Penulisan ${1:-/var/www} berarti "argumen pertama, dan jika tidak ada — /var/www". Simpan skrip sebagai /usr/local/bin/backup-site.sh dan jadikan dapat dieksekusi: sudo chmod +x /usr/local/bin/backup-site.sh.

Menjalankan secara terjadwal: cron

Cron adalah layanan yang menjalankan perintah sesuai jadwal. Tugas milik pengguna diedit dengan crontab -e, dilihat dengan crontab -l, dan tugas milik root dengan sudo crontab -e.

Satu baris tugas terdiri dari lima bidang waktu dan perintahnya:

# menit jam tanggal_dalam_bulan bulan hari_dalam_minggu perintah
30 2 * * * /usr/local/bin/backup-site.sh >> /var/log/backup.log 2>&1
JadwalKapan dijalankan
*/5 * * * *setiap 5 menit
0 * * * *setiap awal jam
30 2 * * *setiap hari pukul 02:30
0 9 * * 1-5hari kerja pukul 09:00
0 3 1 * *tanggal 1 setiap bulan pukul 03:00
@rebootsekali setelah boot

Mengapa skrip berjalan saat dijalankan manual tetapi tidak di cron

  • Lingkungan berbeda. Cron menjalankan tugas dengan PATH minimal dan tanpa ~/.bashrc. Tulis path lengkap untuk perintah dan berkas, atau atur PATH di awal crontab.
  • Direktori kerja berbeda. Tugas dimulai dari direktori home, bukan dari tempat skrip berada. Gunakan path absolut.
  • Karakter %. Di crontab, % berarti baris baru, sehingga date +%F langsung di baris tugas harus ditulis \%. Lebih mudah memindahkan perintah itu ke dalam skrip.
  • Keluaran hilang. Alihkan keluaran ke log (>> berkas 2>&1), jika tidak, error tidak akan terlihat. Eksekusi cron bisa dilihat di journalctl -u cron (di sistem keluarga RHEL layanannya bernama crond).

Pada sistem dengan systemd, timer systemd bisa menjadi alternatif cron: keluarannya masuk ke journal dan tugas yang terlewat dapat dikejar.

Kesimpulan

Skrip bash untuk pemula adalah berkas dengan shebang #!/bin/bash, izin eksekusi, dan urutan perintah. Tambahkan variabel dalam tanda kutip, pemeriksaan argumen dengan if, perulangan for dan while, serta mode ketat set -euo pipefail — dan Anda mendapat alat otomatisasi yang andal, yang bisa dijalankan cron sesuai jadwal. Skrip bash, lingkungan, dan cron dibahas dengan praktik dalam kursus Linux.

Pertanyaan umum

Apa bedanya bash dan sh?

sh adalah shell standar POSIX, sedangkan bash adalah versi yang lebih lengkap dengan array, kurung ganda, dan fitur lainnya. Skrip yang memakai konstruksi bash harus dijalankan dengan bash, bukan sh.

Apa ekstensi yang harus dipakai untuk skrip bash?

Linux tidak memperhatikan ekstensi; interpreter ditentukan oleh shebang. Ekstensi .sh hanya konvensi agar manusia tahu bahwa itu skrip.

Bagaimana memberikan kata sandi ke skrip dengan aman?

Jangan meneruskannya sebagai argumen, karena argumen terlihat oleh pengguna lain lewat ps. Gunakan variabel lingkungan dari berkas berizin 600, atau read -s untuk memasukkan input tanpa ditampilkan.

Bagaimana memeriksa apakah skrip dijalankan sebagai root?

Bandingkan ID pengguna dengan nol: if [[ $EUID -ne 0 ]]; then echo "Perlu root"; exit 1; fi.

Bagaimana menjalankan skrip di latar belakang agar tidak berhenti setelah keluar dari SSH?

Gunakan nohup ./script.sh &, sesi tmux atau screen, dan untuk penggunaan jangka panjang jadikan skrip sebagai layanan systemd.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.

Ke kursus