리눅스 명령행 인자: 명령어 옵션과 따옴표, 옵션 끝 표시, $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))
doneKami 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/wwwBagi 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 sitetotal 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.htmlLalu kami membandingkannya dengan diff terhadap output [ls -la] yang menyambung kedua huruf.
diff <(ls -l -a site) <(ls -la site) && echo samesameKedua 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 sitels: 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.txtalpha
betaOpsi panjang menyambung nilainya dengan tanda sama dengan, seperti [--lines=2].
head --lines=2 a.txtalpha
betaKeempat 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 -ntotal 4
-rw-r--r-- 1 0 0 10 Oct 28 16:00 -nArgumen yang ditulis setelah -- tidak dibaca sebagai opsi meski diawali tanda hubung. [ls -- -n] hanya mencetak nama file -n.
ls -- -n-nDalam 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 fileCara 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.
| Parameter | Nilai yang dimuat | Fungsi main bahasa C |
|---|---|---|
| $0 | Nama skrip yang dijalankan | argv[0] |
| $1 ~ $9 | Argumen pertama sampai kesembilan | argv[1] ~ argv[9] |
| ${10} | Mulai argumen kesepuluh diapit kurung kurawal | argv[10] |
| $# | Jumlah argumen, $0 tidak dihitung | argc - 1 |
| "$@" | Semua argumen, masing-masing terpisah | argv[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" dwith "$@"
[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.txtbefore shift: $1 = -v, $# = 3
after shift: $1 = a.txt, $# = 2Mulai 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.
🔢 FAQ & Konten yang Direkomendasikan
Wildcard
[Karakter khusus shell] Wildcard Linux (metakarakter)
Artikel yang merangkum dengan contoh cara memilih nama file dengan karakter wildcard seperti * dan ? serta kelas karakter.
Beberapa perintah
[Linux] 5 cara merangkai perintah (titik koma, pipa, ampersand..)
Artikel yang merangkum lima cara menjalankan beberapa perintah dalam satu baris dengan titik koma, pipa, &&, ||, dan &.
Mencetak teks
Perintah echo: From ekspansi dan kutipan
Artikel yang merangkum cara mencetak teks dan nilai variabel dengan echo beserta opsinya.
ℹ️ 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.