Saya punya kode ini -
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Ketika saya menjalankan bash getoptDemos.sh
(tanpa opsi) itu mencetak hi
bukannya memanggil fungsi usage
. Itu panggilan penggunaan ketika opsi selain w, h dan l diberikan. Maka tidak bisa bekerja ketika tidak ada opsi yang ditentukan.
Saya telah mencoba menggunakan ?
, \?
, :
di tempat *
tapi aku tidak bisa mencapai apa yang saya ingin. Maksud saya semua docs
pada getopt
mengatakan itu untuk digunakan ?
.
Apa yang saya lakukan salah?
/bin/bash
Jawaban:
Ketika Anda menjalankan skrip ini tanpa opsi apa pun, getopt akan mengembalikan false, sehingga tidak akan masuk loop sama sekali. Ini hanya akan drop down ke cetakan - apakah ini ksh / zsh?
Jika Anda harus memiliki opsi, Anda sebaiknya menguji $ name setelah loop.
Tetapi pastikan
$name
kosong sebelum memanggilgetopts
(karena mungkin ada$name
di lingkungan shell diterima pada startup) dengan(sebelum
getopts
loop)sumber
no argument
kondisi menggunakan bash.getopts
sekali tidak memiliki ketentuan seperti itu. Apa yang lebih buruk dari itu tidak bisa membuat Anda marah.getopts
memproses opsi pada gilirannya. Itu tugasnya. Jika pengguna kebetulan tidak memberikan opsi, permintaan pertamagetopts
keluar dari loop sementara.Jika tidak ada opsi yang mengambil argumen, nilai
OPTIND
menunjukkan berapa banyak opsi yang dilewati. Secara umum,OPTIND
adalah jumlah argumen yang merupakan opsi atau argumen untuk opsi, yang bertentangan dengan argumen non-opsi (operan).Bagaimanapun, Anda tidak mencoba menentukan apakah tidak ada opsi, tetapi apakah tidak ada
name
opsi-pengaturan yang dilewati. Jadi periksa apakahname
tidak disetel (dan berhati-hatilah untuk membatalkannya terlebih dahulu) .sumber
bash sample.sh -abc file.txt
itu memberi -1 non-option arguments
. bagaimana cara mengetahui berapa banyak opsi yang diberikan. (di sini 3)Jika skrip Anda harus menerima argumen opsi, letakkan blok ini di awal (sebelum getops).
Block memeriksa bahwa string parameter tidak diawali dengan
-
simbol, yang menunjukkan bahwa parameter pertama bukanlah argumen opsi.sumber
Saya akan memeriksanya dengan variabel. Jika getopts tidak pernah melewati loop jika tidak ada argumen, Anda dapat menggunakannya misalnya seperti ini:
sumber
Tepat sebelum
getopts
blok Anda , periksa untuk melihat apakah$1
(argumen / opsi pertama yang Anda berikan pada baris perintah) sama dengan string kosong. Jika ya, cetak pesan penggunaan dan keluar, (atau jalankan beberapa fungsi "tidak ada opsi" jika Anda seorang anarkis), jika tidak biarkangetopts
mengurai opsi seperti biasa.Alasan fitur ini tidak termasuk dalam getopts, adalah karena Anda sudah dapat menyelesaikannya di bash dengan "jika-lain". Contoh:
Masuk akal?
sumber