Skrip bash untuk pemula: skrip pertama, variabel, kondisi, perulangan, dan cron
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 izinx. Awalan./wajib, karena direktori saat ini tidak termasuk dalamPATH.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.
| Variabel | Isinya |
|---|---|
$0 | nama 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
| Pemeriksaan | Arti |
|---|---|
-f file | berkas biasa ada |
-d dir | direktori ada |
-e path | path ada |
-x file | berkas dapat dieksekusi |
-z "$var" / -n "$var" | string kosong / tidak kosong |
"$a" == "$b", != | perbandingan string |
-eq -ne -lt -le -gt -ge | perbandingan 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 darirm -rf "$DIR/"saatDIRkosong).-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
| Jadwal | Kapan dijalankan |
|---|---|
*/5 * * * * | setiap 5 menit |
0 * * * * | setiap awal jam |
30 2 * * * | setiap hari pukul 02:30 |
0 9 * * 1-5 | hari kerja pukul 09:00 |
0 3 1 * * | tanggal 1 setiap bulan pukul 03:00 |
@reboot | sekali setelah boot |
Mengapa skrip berjalan saat dijalankan manual tetapi tidak di cron
- Lingkungan berbeda. Cron menjalankan tugas dengan
PATHminimal dan tanpa~/.bashrc. Tulis path lengkap untuk perintah dan berkas, atau aturPATHdi awal crontab. - Direktori kerja berbeda. Tugas dimulai dari direktori home, bukan dari tempat skrip berada. Gunakan path absolut.
- Karakter %. Di crontab,
%berarti baris baru, sehinggadate +%Flangsung 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 dijournalctl -u cron(di sistem keluarga RHEL layanannya bernamacrond).
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.
Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.
- Bash-скрипты: от команды в терминале до рабочего скрипта автоматизации
- Пакеты, окружение и первая автоматизация: apt, профиль и cron