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:

bash
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 Santoso

Output yang Dihasilkan:

text
jumlah argumen : 1
argumen pertama: Budi
argumen kedua  : kosong
jumlah argumen : 2
argumen pertama: Budi
argumen kedua  : Santoso

Variabel-variabel pentingnya dirangkum pada tabel berikut:

VariabelIsi
$0nama 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:

bash
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:

text
[Budi Santoso]
[Siti Rahma]
---
sisa  : Siti Rahma
jumlah: 1

Mari kita bedah isi hitung.sh baris per barisnya:

  1. Baris 2-4 (for a in "$@"): mengulang tiap argumen; kurung siku [ ] memperlihatkan batas tiap elemen, dan Budi Santoso tetap utuh satu baris — hasil dari tanda kutip pada ".
  2. Baris 6 (shift): membuang $1 lama; Siti Rahma naik menjadi $1, $# turun dari 2 menjadi 1.
  3. 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:

bash
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.txt

Output yang Dihasilkan:

text
berkas: catatan.txt
mode  : layar
berkas: data.txt
mode  : diam

Bagian 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.