리눅스 명령행 인자: 명령어 옵션과 따옴표, 옵션 끝 표시, $1, $# 받기

Lingkungan ujiKeluarga RHELAlmaLinux 9.8bash 5.1akun root
Shell$1$#--

Argumen baris perintah Linux (command-line argument) adalah nilai yang diberikan ke program dengan menuliskannya setelah nama perintah, dipisahkan spasi. Saat kami memberikan opsi, tanda kutip, wildcard, dan -- ke skrip uji yang mencetak argumen yang diterimanya apa adanya di server AlmaLinux 9, yang memisahkan argumen adalah shell, sedangkan yang membaca opsi adalah masing-masing perintah.

Output di bawah adalah hasil apa adanya dari bash 5.1 pada akun root server AlmaLinux 9.8. Skrip uji dan file contoh dibuat di folder kerja terpisah, dan path /home/user/www adalah nilai contoh.

1️⃣ Apa itu argumen baris perintah Linux?

Jika Anda menulis sesuatu seperti [perintah arg1 arg2] di baris perintah, shell memisahkan kata-katanya berdasarkan spasi. Kata pertama menjadi program yang dijalankan, dan kata-kata lainnya diberikan berurutan ke program itu sebagai argumennya.

Untuk melihat argumen yang diterima, kami membuat args.sh di folder kerja. $0 berisi nama yang dipakai untuk menjalankannya, $# berisi jumlah argumen, dan mulai $1 berisi argumen secara berurutan. Kurung siku ditambahkan agar terlihat di mana tiap argumen mulai dan berakhir.

#!/bin/bash
echo "\$0 = $0"
echo "\$# = $#"
i=1
for a in "$@"; do
  echo "\$$i = [$a]"
  i=$((i+1))
done

Kami memberi skrip izin eksekusi lalu menjalankannya dengan tiga kata: a, b, dan c.

./args.sh a b c
$0 = ./args.sh
$# = 3
$1 = [a]
$2 = [b]
$3 = [c]

Ketiga kata masuk ke $1, $2, dan $3, dan $# bernilai 3. Jika skrip dijalankan dengan menulis namanya setelah bash, $0 berisi nama persis seperti yang ditulis, yaitu args.sh.

bash args.sh a b c
$0 = args.sh
$# = 3
$1 = [a]
$2 = [b]
$3 = [c]

Hanya $0 yang berubah menjadi args.sh; ketiga argumen dan jumlahnya sama seperti hasil sebelumnya.

2️⃣ Argumen baris perintah dan opsi perintah

Perintah Linux biasanya ditulis dengan urutan [perintah -opsi argumen]. Opsi mengubah cara perintah bekerja, sedangkan argumen menentukan file, path, atau nilai yang diolah perintah.

ls -l /home/user/www

Bagi shell, -l juga hanya sebuah argumen. Saat kata yang sama diberikan ke args.sh, -l masuk ke $1 dan path masuk ke $2.

./args.sh -l /home/user/www
$0 = ./args.sh
$# = 2
$1 = [-l]
$2 = [/home/user/www]

Yang membaca -l sebagai opsi adalah ls. Karena itu huruf yang sama bisa berarti lain di tiap perintah: -n pada head menentukan jumlah baris yang dicetak, sedangkan -n pada ls menampilkan pemilik sebagai nomor, bukan nama.

Ada opsi yang mengambil kata tepat di belakangnya sebagai nilainya sendiri. Pada perintah find, -type memakai f dan -name memakai "*.txt" sebagai nilainya; nilai yang melekat pada opsi seperti ini disebut argumen opsi.

find . -type f -name "*.txt"

Dalam perintah ini, . di depan adalah argumen yang tidak melekat pada opsi mana pun dan menentukan folder tempat pencarian dimulai.

3️⃣ Format opsi perintah Linux

Opsi pendek diawali satu tanda hubung, terdiri dari satu huruf, dan beberapa bisa ditulis bersambung. Pertama, kami menampilkan folder site di folder kerja dengan [ls -l -a].

ls -l -a site
total 8
drwxr-xr-x 3 root root  52 Oct 28 16:00 .
drwxr-xr-x 3 root root 137 Oct 29 01:20 ..
-rw-r--r-- 1 root root  17 Oct 28 16:00 .htaccess
drwxr-xr-x 2 root root  23 Oct 28 16:00 css
-rw-r--r-- 1 root root  14 Oct 28 16:00 index.html

Lalu kami membandingkannya dengan diff terhadap output [ls -la] yang menyambung kedua huruf.

diff <(ls -l -a site) <(ls -la site) && echo same
same

Kedua output tidak berbeda satu karakter pun. Opsi panjang diawali dua tanda hubung dan ditulis sebagai kata; --all pada ls adalah opsi yang sama dengan -a, sehingga [ls -l --all site] juga memberi hasil yang sama.

Opsi panjang tetap diterima meski hanya bagian awalnya yang ditulis, asalkan cocok dengan satu opsi saja. --al cocok dengan dua opsi, --all dan --almost-all, sehingga ls tidak mencetak daftar dan berhenti dengan kode keluar 2.

ls --al site
ls: option '--al' is ambiguous; possibilities: '--all' '--almost-all'
Try 'ls --help' for more information.

Opsi yang menerima nilai bisa ditulis dalam beberapa bentuk. Saat mencetak dua baris pertama a.txt dengan head, opsi pendek bisa ditulis dengan nilai menempel, seperti [-n2].

head -n2 a.txt
alpha
beta

Opsi panjang menyambung nilainya dengan tanda sama dengan, seperti [--lines=2].

head --lines=2 a.txt
alpha
beta

Keempat bentuk, termasuk [-n 2] dan [--lines 2] yang dipisah spasi, mencetak dua baris alpha dan beta.

ls, head, dan cat membaca opsinya dengan fungsi getopt_long dari pustaka C. Saat ketiga file program diperiksa dengan strings, semuanya berisi nama fungsi ini.

Untuk memeriksa aturan yang sama dari shell, gunakan perintah getopt dari util-linux. Tulis opsi pendek setelah -o dan opsi panjang setelah -l; titik dua setelah huruf berarti opsi itu menerima nilai.

getopt -o lan: -l all,lines: -- -la -n 2 --all a.txt
 -l -a -n '2' --all -- 'a.txt'

-la yang ditulis bersambung dipecah menjadi -l dan -a, dan -n 2 digabung menjadi -n dengan nilai 2. a.txt yang bukan opsi dipindah ke paling belakang, setelah --.

4️⃣ Argumen dalam tanda kutip dan wildcard

Nama file yang berisi spasi harus diapit tanda kutip agar diberikan sebagai satu argumen.

./args.sh "my file.txt" report.txt
$0 = ./args.sh
$# = 2
$1 = [my file.txt]
$2 = [report.txt]

Tanpa tanda kutip, my dan file.txt terpisah dan $# menjadi 3. Jika diberikan seperti ini ke ls atau cat, keduanya akan mencari dua file bernama my dan file.txt.

./args.sh my file.txt report.txt
$0 = ./args.sh
$# = 3
$1 = [my]
$2 = [file.txt]
$3 = [report.txt]

Wildcard diubah shell menjadi nama file sebelum program menerimanya. Saat *.txt diberikan di folder kerja, empat file yang berakhiran .txt masuk berurutan menurut nama.

./args.sh *.txt
$0 = ./args.sh
$# = 4
$1 = [a.txt]
$2 = [b.txt]
$3 = [my file.txt]
$4 = [report.txt]

"*.txt" yang diapit tanda kutip tidak diubah shell dan menjadi satu argumen persis seperti tertulis. Untuk opsi seperti -name pada find, yang polanya dibandingkan sendiri oleh program, nilainya diberikan dengan tanda kutip seperti ini.

./args.sh "*.txt"
$0 = ./args.sh
$# = 1
$1 = [*.txt]

Tanda kutip kosong juga diberikan sebagai satu argumen kosong. Saat [./args.sh '' b] dijalankan, $# bernilai 2 dan $1 kosong.

5️⃣ Akhir opsi perintah (--)

Argumen yang diawali tanda hubung, seperti file bernama -n, dibaca perintah sebagai opsi. Saat [ls -n] dijalankan di folder dash yang hanya berisi file itu, ls menganggap -n bukan nama file melainkan opsi tampilan nomor, lalu mencetak daftar folder.

ls -n
total 4
-rw-r--r-- 1 0 0 10 Oct 28 16:00 -n

Argumen yang ditulis setelah -- tidak dibaca sebagai opsi meski diawali tanda hubung. [ls -- -n] hanya mencetak nama file -n.

ls -- -n
-n

Dalam satu perintah pun, karakter yang sama dibaca berbeda sebelum dan sesudah --. Saat -n diberikan dua kali ke cat, -n pertama dibaca sebagai opsi nomor baris dan -n setelah -- dibaca sebagai nama file, sehingga isi file keluar dengan nomor baris.

cat -n -- -n
     1	dash file

Cara lain adalah menambahkan path dan menulis ./-n; dalam hal ini argumen tidak diawali tanda hubung sehingga dibaca sebagai file -n yang sama.

Membaca -- sebagai akhir opsi juga aturan di sisi perintah. Saat diberikan ke args.sh yang tidak membaca opsi, -- pun masuk apa adanya ke $1.

./args.sh -- -a
$0 = ./args.sh
$# = 2
$1 = [--]
$2 = [-a]

Konvensi utilitas POSIX menetapkan bahwa -- pertama yang bukan argumen opsi diterima sebagai akhir opsi. Karena itu, pada perintah yang mengikuti konvensi ini, nama file yang diawali - ditulis setelah --.

6️⃣ Menerima argumen baris perintah di skrip shell

Skrip shell membaca argumen yang diterimanya melalui parameter posisi dan parameter khusus. main(int argc, char *argv[]) pada program C juga menerima argumen yang sama, sehingga jika keduanya disandingkan hasilnya seperti di bawah.

ParameterNilai yang dimuatFungsi main bahasa C
$0Nama skrip yang dijalankanargv[0]
$1 ~ $9Argumen pertama sampai kesembilanargv[1] ~ argv[9]
${10}Mulai argumen kesepuluh diapit kurung kurawalargv[10]
$#Jumlah argumen, $0 tidak dihitungargc - 1
"$@"Semua argumen, masing-masing terpisahargv[1] sampai akhir
"$*"Semua argumen digabung jadi satu dengan spasi—

Program Python menerima argumen yang sama sebagai daftar sys.argv. Saat tiga argumen diberikan dengan [python3 -c], my file.txt yang diapit tanda kutip masuk ke satu elemen daftar, dan elemen pertama berisi -c.

python3 -c 'import sys; print(sys.argv)' a "my file.txt" -l
['-c', 'a', 'my file.txt', '-l']

"$@" dan "$*" memberi hasil berbeda saat diapit tanda kutip ganda. Untuk melihat perbedaannya, kami membuat star.sh yang mencetak kedua bentuk itu berurutan.

#!/bin/bash
echo 'with "$@"'
printf '  [%s]\n' "$@"
echo 'with "$*"'
printf '  [%s]\n' "$*"

Kami menjalankan star.sh dengan tiga argumen: a, "b c", dan d.

./star.sh a "b c" d
with "$@"
  [a]
  [b c]
  [d]
with "$*"
  [a b c d]

"$@" meneruskan ketiga argumen secara terpisah, sedangkan "$*" menggabungkannya dengan spasi dan meneruskannya sebagai satu.

Karena itu, untuk meneruskan argumen yang diterima ke perintah lain apa adanya, gunakan "$@".

shift membuang $1 dan menggeser sisa argumen satu posisi ke depan. Perintah ini dipakai di skrip yang membaca satu opsi lebih dulu lalu memperlakukan sisanya sebagai daftar file.

Kami membuat shift.sh yang mencetak $1 dan $# sebelum dan sesudah shift.

#!/bin/bash
echo "before shift: \$1 = $1, \$# = $#"
shift
echo "after shift:  \$1 = $1, \$# = $#"

Kami menjalankan shift.sh dengan tiga argumen: -v, a.txt, dan b.txt.

./shift.sh -v a.txt b.txt
before shift: $1 = -v, $# = 3
after shift:  $1 = a.txt, $# = 2

Mulai argumen kesepuluh, angkanya diapit kurung kurawal seperti ${10}. Kami membuat ten.sh yang mencetak $10 dan ${10} berdampingan.

#!/bin/bash
echo "\$10 = $10"
echo "\${10} = ${10}"

Kami memberikan 11 argumen, dari a sampai k, ke ten.sh.

./ten.sh a b c d e f g h i j k
$10 = a0
${10} = j

$10 keluar sebagai a0, yaitu $1 diikuti 0, sedangkan ${10} keluar sebagai argumen kesepuluh, j.

🔲 Simulator argumen baris perintah

Di simulator di bawah, Anda bisa memberikan tanda kutip, wildcard, dan -- ke args.sh, serta mengetik sendiri perintah untuk melihat cara ls dan getopt membaca opsi dan cara star.sh dan shift.sh menerima argumen.

Simulator argumen baris perintahbash 5.1
[root@server work]#
Server AlmaLinux virtual yang hanya berjalan di browser Anda; args.sh mencetak argumen yang diterima beserta nomornya, dan ↑↓ memanggil kembali perintah yang dipakai sebelumnya.

🔢 FAQ & Konten yang Direkomendasikan

Batas atas panjang gabungan argumen dan variabel lingkungan diperiksa dengan [getconf ARG_MAX]; di server AlmaLinux 9.8 nilainya 2097152 byte. Jika batas ini terlampaui, program tidak berjalan dan muncul galat [Argument list too long]. Jika file sangat banyak, jangan berikan sekaligus dengan wildcard, tetapi bagi dengan -exec pada find atau dengan xargs.

Argumen (argument) adalah nilai yang benar-benar diberikan saat menjalankan perintah, sedangkan parameter (parameter) adalah nama di sisi penerima untuk nilai itu. Di skrip shell, parameter posisi seperti $1 dan $2 menerima argumen yang diberikan.

getopts yang terpasang di bash membaca opsi pendek seperti -v satu per satu. Opsi panjang tidak dibacanya, jadi untuk menerima opsi panjang seperti --verbose juga, rapikan dulu argumen dengan perintah getopt yang dipakai di atas.

ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Buktikan bahwa Anda manusia: 1   +   5   =