Shell script adalah file teks berisi perintah terminal yang dijalankan berurutan dari atas ke bawah. Mirip resep masakan: langkahnya ditulis sekali, lalu tiap kali mau masak kamu tinggal ikuti, dengan bahan yang boleh beda (hari ini 2 porsi, besok 4). Di script, "bahan" itu namanya argumen: teks yang kamu ketik setelah nama script waktu menjalankannya.
🧪 Tebakan cepat: di script kamu menulis
nama = $1, pakai spasi di sekitar=. Apa yang terjadi waktu script-nya jalan? Tebak dulu, jawabannya ada di bagian "Variabel dan argumen".
Script pertamamu: sapa.sh
#!/bin/bash
# sapa.sh: menyapa nama dari argumen pertama
nama=$1
if [ -z "$nama" ]; then
echo "Nama belum diisi. Pakai: ./sapa.sh NAMA"
exit 1
fi
for i in 1 2 3; do
echo "Sapaan ke-$i untuk $nama"
done
- Baris 1,
#!/bin/bash, namanya shebang. Dia memberi tahu sistem program mana yang membaca file ini (interpreter-nya): bash, yang ada di/bin/bash. Harus di baris pertama, persis diawali#!. - Baris lain yang diawali
#adalah komentar: dilewati, cuma catatan buat manusia. - Sisanya perintah yang biasa kamu ketik di terminal, dijalankan satu per satu dari atas.
Simpan sebagai sapa.sh, beri izin eksekusi, lalu jalankan:
$ chmod +x sapa.sh
$ ./sapa.sh Budi
Sapaan ke-1 untuk Budi
Sapaan ke-2 untuk Budi
Sapaan ke-3 untuk Budi
chmod +x sapa.shmemberi izin eksekusi (x), seperti di pelajaran Permission. Tanpa itu,./sapa.shditolak:bash: ./sapa.sh: Permission denied../artinya "file di folder ini". Tanpa./, bash mencarisapa.shdi folder-folder PATH, gak ketemu, lalu bilangbash: sapa.sh: command not found.bash sapa.sh Budijuga jalan, bahkan tanpachmod, karena bash sendiri yang membaca file-nya. Shebang baru dipakai waktu kamu menjalankan./sapa.sh.
Variabel dan argumen
nama=$1menyimpan argumen pertama ke variabelnama. Gak boleh ada spasi di sekitar=.$namamembaca isinya. Di dalam tanda kutip dua, seperti"Sapaan ke-$i untuk $nama", variabelnya tetap diganti isinya.$1adalah argumen pertama,$2yang kedua,$#jumlah argumen, dan$0nama script-nya.
Argumen dipisah spasi. Mau nama dua kata jadi satu argumen? Bungkus dengan tanda kutip:
$ ./sapa.sh "Budi Santoso"
Sapaan ke-1 untuk Budi Santoso
Sapaan ke-2 untuk Budi Santoso
Sapaan ke-3 untuk Budi Santoso
$ ./sapa.sh Budi Santoso
Sapaan ke-1 untuk Budi
Sapaan ke-2 untuk Budi
Sapaan ke-3 untuk Budi
Tanpa kutip, Budi jadi $1 dan Santoso jadi $2, yang gak dipakai script ini.
Sekarang tulis nama = $1. Bash membacanya sebagai perintah bernama nama dengan argumen = dan Budi, padahal perintah itu gak ada:
$ ./sapa.sh Budi
./sapa.sh: line 3: nama: command not found
Nama belum diisi. Pakai: ./sapa.sh NAMA
Variabel nama gak pernah terisi, jadi if di bawahnya mengira namanya kosong. Itu jawaban tebakannya.
if: cek dulu sebelum jalan
[ -z "$nama" ]adalah tes.-zbenar kalau teksnya kosong (zero length). Spasi setelah[dan sebelum]wajib.thenmembuka bagian yang dijalankan kalau tesnya benar,fi(if dibalik) menutupnya. Kalau perlu cabang lain, adaelsedanelif.exit 1menghentikan script dengan kode gagal 1. Baris di bawahnya gak dijalankan lagi.
Tes lain yang sering dipakai:
| Tes | Benar kalau |
|---|---|
-z "$a" / -n "$a" |
teksnya kosong / gak kosong |
"$a" = "$b" / "$a" != "$b" |
dua teks sama / beda |
$x -eq 3, -ne, -lt, -gt, -le, -ge |
angka sama, beda, kurang dari, lebih dari, kurang atau sama, lebih atau sama |
-f file.txt / -d folder |
file / folder itu ada |
for: ulangi untuk tiap item
for i in 1 2 3; do ... done mengambil daftar setelah in, lalu menjalankan bagian antara do dan done sekali untuk tiap item. Tiap putaran, i berisi item itu: 1, lalu 2, lalu 3. Tiga item, tiga putaran, jadi echo di dalamnya mencetak tiga baris. Tambah item 4, keluar empat baris. Daftarnya bisa apa saja: for f in *.txt mengulang untuk tiap file .txt.
$?: berhasil atau gagal
Tiap perintah selesai dengan exit code, angka yang bilang dia berhasil atau gagal. $? menyimpan exit code perintah terakhir:
$ ./sapa.sh
Nama belum diisi. Pakai: ./sapa.sh NAMA
$ echo $?
1
| Exit code | Artinya |
|---|---|
0 |
berhasil |
1 |
gagal, misalnya exit 1 di script kita |
126 |
file-nya ada tapi gak boleh dijalankan (lupa chmod +x) |
127 |
perintahnya gak ketemu |
Script yang selesai tanpa exit memakai exit code perintah terakhirnya, di sini echo, jadi 0. Baca $? langsung setelah perintahnya, karena perintah berikutnya menimpanya.
⚠️ Jebakan yang sering ketemu
- Spasi di sekitar
=.nama = $1berakhir dengannama: command not found. Tulisnama=$1. - Variabel tanpa tanda kutip di dalam
[ ]. Kalau isinyaBudi Santoso,[ -z $nama ]jadi[ -z Budi Santoso ], dan bash protes[: Budi: binary operator expected. Selalu tulis"$nama". - Lupa
chmod +xatau lupa./. HasilnyaPermission denied(exit code 126) ataucommand not found(127). - Script disimpan dengan akhir baris Windows (CRLF). Shebang-nya terbaca
/bin/bashplus karakter tersembunyi, dan bash bilangbad interpreter: No such file or directory. Simpan dengan akhir baris LF (di VS Code, klik tulisan CRLF di pojok kanan bawah).
TL;DR: Shell script adalah file berisi perintah yang jalan dari atas ke bawah. Baris pertama #!/bin/bash (shebang) memberi tahu sistem interpreter mana yang menjalankannya. Beri izin dengan chmod +x sapa.sh, jalankan dengan ./sapa.sh Budi (atau bash sapa.sh Budi). Variabel ditulis tanpa spasi (nama=$1), dibaca dengan "$nama", dan $1 adalah argumen pertama. if [ -z "$nama" ]; then ... fi mengecek dulu, exit 1 berhenti dengan kode gagal. for i in 1 2 3; do ... done berjalan sekali per item, jadi tiga item = tiga baris. $? berisi exit code perintah terakhir: 0 berhasil, selain 0 gagal.