Saat Anda menulis sedikit baris perintah parsing kode Anda, Anda menentukan opsi apa yang mengambil argumen dan mana yang tidak. Misalnya, dalam skrip shell yang menerima -h
opsi (untuk bantuan misalnya) dan -a
opsi yang harus mengambil argumen, Anda lakukan
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
The a:h
bit mengatakan "Saya mengharapkan untuk mengurai dua pilihan, -a
dan -h
, dan -a
harus mengambil argumen" (itu adalah :
setelah a
yang memberitahu parser yang -a
mengambil argumen).
Oleh karena itu, tidak pernah ada ambiguitas di mana opsi berakhir, di mana nilainya dimulai, dan di mana yang lain dimulai setelah itu.
Menjalankannya:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
Inilah sebabnya mengapa Anda sebagian besar waktu seharusnya tidak menulis parser baris perintah Anda sendiri untuk opsi parse.
Hanya ada satu kasus dalam contoh ini yang rumit. Penguraian biasanya berhenti pada opsi pertama, jadi ketika Anda memiliki item di baris perintah yang terlihat seperti opsi:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
Berikut ini memecahkan itu:
$ bash test.sh -a hello -- -world
h: 0
a: hello
The --
sinyal mengakhiri opsi baris perintah, dan -world
bit yang tersisa untuk program untuk melakukan apapun yang diinginkan dengan (itu di salah satu variabel posisi).
Omong-omong, bagaimana Anda menghapus file yang memiliki tanda hubung di awal nama file-nya rm
.
EDIT :
Utilitas yang ditulis dalam panggilan C getopt()
(dinyatakan dalam unistd.h
) yang bekerja dengan cara yang hampir sama. Bahkan, untuk semua yang kita tahu, bash
fungsi getopts
tersebut dapat diimplementasikan menggunakan panggilan ke fungsi C library getopt()
. Perl, Python dan bahasa lain memiliki parsing pustaka baris perintah yang sama, dan kemungkinan besar parsing mereka lakukan dengan cara yang sama.
Beberapa ini getopt
dan getopt
-seperti rutinitas perpustakaan juga menangani "lama" pilihan. Ini biasanya didahului dengan double-dash ( --
), dan opsi panjang yang mengambil argumen sering melakukannya setelah tanda sama dengan, misalnya --block-size=SIZE
opsi [beberapa implementasi] du
utilitas (yang juga memungkinkan untuk -B SIZE
menentukan hal yang sama).
Alasan mengapa manual sering ditulis untuk menunjukkan ruang di antara opsi pendek dan argumen mereka mungkin untuk dibaca.
EDIT : Alat yang benar - benar tua, seperti dd
dan tar
utilitas, memiliki opsi tanpa tanda hubung di depannya. Ini murni karena alasan historis dan untuk menjaga kompatibilitas dengan perangkat lunak yang bergantung pada mereka untuk bekerja dengan cara seperti itu. The tar
utilitas telah memperoleh kemampuan untuk mengambil pilihan dengan strip di kali yang lebih baru. Manual BSD untuk tar
panggilan opsi gaya lama untuk "bundled flags".