Perintah seperti cp sumber tujuan dan ls -l folder menerima data dari pemakainya lewat baris perintah. Skrip yang kita tulis sejauh ini belum bisa — semua datanya tertanam di dalam kode, sehingga tiap kebutuhan baru berarti menyunting skrip. Bash sebenarnya menyediakan mekanisme yang sama persis: argumen posisi untuk data dan options untuk pengaturan perilaku. Chapter ini membahas keduanya — mulai dari $1 dan $#, iterasi dengan "$@", shift, sampai parsing opsi terstruktur dengan getopts.
Argumen Posisi: $1, $2, dan $# #
Saat skrip dipanggil, bash menyalin semua kata setelah nama skrip ke variabel bernomor. Dua skrip dipanggil dengan jumlah argumen berbeda pada blok berikut untuk memperlihatkan isinya:
cat > salam.sh <<'AKHIR'
#!/bin/bash
echo "jumlah argumen : $#"
echo "argumen pertama: $1"
echo "argumen kedua : ${2-kosong}"
AKHIR
bash salam.sh Budi
bash salam.sh Budi SantosoOutput yang Dihasilkan:
jumlah argumen : 1
argumen pertama: Budi
argumen kedua : kosong
jumlah argumen : 2
argumen pertama: Budi
argumen kedua : SantosoVariabel-variabel pentingnya dirangkum pada tabel berikut:
| Variabel | Isi |
|---|---|
$0 | nama skrip itu sendiri, misalnya salam.sh |
$1, $2, … | argumen pertama, kedua, dan seterusnya |
$# | jumlah argumen yang menyertai pemanggilan |
"$@" | semua argumen, masing-masing tetap satu kesatuan |
"$*" | semua argumen digabung menjadi satu string |
Pemanggilan pertama hanya membawa satu argumen sehingga $# bernilai 1, dan ${2-kosong} menampilkan teks cadangan kosong karena argumen kedua memang tidak ada — pola parameter expansion dari Chapter Variables dan Quoting. Pemanggilan kedua mengisi keduanya. Cek $# di awal skrip adalah pintu gerbang validasi paling sederhana: bila jumlahnya kurang, skrip bisa langsung menolak dengan exit 1 seperti pola Chapter Exit Status dan Error Handling.
Iterasi Semua Argumen dan shift #
Untuk jumlah argumen yang tidak pasti, "$@" adalah bentuk yang tepat: setiap elemennya tetap utuh satu kesatuan, termasuk yang mengandung spasi. Setelah itu, shift membuang argumen pertama dan menggeser sisanya — berguna saat argumen pertama adalah perintah atau label khusus:
cat > hitung.sh <<'AKHIR'
#!/bin/bash
for a in "$@"; do
echo "[$a]"
done
echo "---"
shift
echo "sisa : $@"
echo "jumlah: $#"
AKHIR
bash hitung.sh "Budi Santoso" "Siti Rahma"Output yang Dihasilkan:
[Budi Santoso]
[Siti Rahma]
---
sisa : Siti Rahma
jumlah: 1Mari kita bedah isi hitung.sh baris per barisnya:
- Baris 2-4 (
for a in "$@"): mengulang tiap argumen; kurung siku[ ]memperlihatkan batas tiap elemen, danBudi Santosotetap utuh satu baris — hasil dari tanda kutip pada". - Baris 6 (
shift): membuang$1lama;Siti Rahmanaik menjadi$1,$#turun dari2menjadi1. - Baris 7-8 (
echo ...): mencetak sisa argumen dan jumlah barunya sebagai bukti pergeseran.
Bandingkan dengan "$*" yang menggabungkan semua argumen menjadi satu string terikat IFS — perulangan for a in "$*" hanya berputar sekali meski argumennya dua. Karena itu pegangan komunitas tegas: pakai "$@" untuk daftar, "$*" hanya saat memang ingin satu string, seperti mencetak argumen dalam satu baris pesan error.
Memproses Options dengan getopts #
Options seperti -f catatan.txt dan -q adalah konvensi antarmuka yang sudah disepakati semua perintah Linux. Builtin getopts mem-parse options satu per satu dalam while, memberikan tiap huruf opsi ke variabel opt untuk diproses lewat case:
cat > arsip.sh <<'AKHIR'
#!/bin/bash
mode="layar"
while getopts "f:q" opt; do
case "$opt" in
f) berkas="$OPTARG" ;;
q) mode="diam" ;;
\?) echo "opsi tidak dikenal" >&2; exit 1 ;;
esac
done
echo "berkas: ${berkas-tidak ditentukan}"
echo "mode : $mode"
AKHIR
bash arsip.sh -f catatan.txt
bash arsip.sh -q -f data.txtOutput yang Dihasilkan:
berkas: catatan.txt
mode : layar
berkas: data.txt
mode : diamBagian pentingnya adalah string "f:q" pada baris getopts: tiap huruf adalah nama opsi, dan tanda titik dua : setelah f menyatakan opsi itu butuh nilai tambahan. Nilai tersebut tersedia di $OPTARG — pada contoh kita, catatan.txt dan data.txt masuk ke situ lalu disimpan ke variabel berkas. Opsi q tidak bertitik dua sehingga cukup berdiri sendiri sebagai penanda; ia mengubah mode menjadi diam. Pola \? menangkap opsi tak dikenal, mencetak pesan ke stderr, dan menghentikan skrip dengan exit 1; setelah loop selesai, variabel $OPTIND menunjuk posisi argumen non-opsi pertama sehingga $1 bisa diambil dengan shift $((OPTIND-1)). Aturan main lengkap getopts dibaca pada bagian Shell Builtin Commands di halaman manual bash(1)
, sedangkan wawasan praktik memproses argumen dirangkum di BashWiki: Arguments
.
Skrip arsip.sh kita kini punya antarmuka sungguhan seperti perintah bawaan. Satu pola penggunaan terpenting dari argumen adalah nama file yang akan diolah — dan file itulah bintang Chapter berikutnya: Text Processing dalam Skrip, tempat cut, sort, uniq, dan awk mengubah data mentah menjadi laporan.