Dalam skrip saya, saya mencoba memeriksa kesalahan apakah argumen pertama dan satu-satunya sama dengan -v tetapi ini adalah argumen opsional. Saya menggunakan pernyataan if tetapi saya terus mendapatkan kesalahan yang diharapkan operator unary.
ini kodenya:
if [ $1 != -v ]; then
echo "usage: $0 [-v]"
exit
fi
Edit:
Saya harus lebih spesifik: Bagian dari skrip di atas memeriksa argumen opsional dan kemudian, jika argumen tidak dimasukkan, ia harus menjalankan program lainnya.
#!/bin/bash
if [ "$#" -gt "1" ]; then
echo "usage: $0 [-v]"
exit
fi
if [ "$1" != -v ]; then
echo "usage: $0 [-v]"
exit
fi
if [ "$1" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi
echo "usage: $0 [-v]"
;$-
menunjukkan tanda opsi shell aktif, bukan nama skrip saat ini.$-
adalah tidak nama script saat ini.$0
adalah.Jawaban:
Tanda kutip!
Jika tidak, ketika
$1
benar-benar kosong, pengujian Anda menjadi:dari pada
... dan
!=
bukan operator unary (yaitu, yang hanya mampu mengambil satu argumen).sumber
if [[ $1 != -v ]]; then
IFS=1
, maka[ $# -eq 1 ]
tidak akan berperilaku baik, sedangkan[ "$#" -eq 1 ]
berperilaku seperti yang diinginkan sekalipun. Ini kasus patologis, tentu, tetapi lebih baik menulis perangkat lunak yang tidak memilikinya ketika diberi pilihan.Atau untuk apa yang tampak seperti pembantaian yang merajalela, tetapi sebenarnya sederhana ... Cukup banyak mencakup semua kasus Anda, dan tidak ada string kosong atau masalah yang tidak disadari.
Dalam kasus ini, argumen pertama adalah '-v', lalu lakukan kondisional Anda
ps -ef
, jika tidak, dalam semua kasus lainnya buang penggunaan.Jika seseorang tidak peduli di mana argumen '-v' berada, maka cukup letakkan case di dalam satu lingkaran. Itu akan memungkinkan berjalannya semua argumen dan menemukan '-v' di mana saja (asalkan ada). Ini berarti urutan argumen baris perintah tidak penting. Diperingatkan, seperti yang disajikan, variabel arg_match disetel, jadi ini hanyalah sebuah bendera. Ini memungkinkan beberapa kemunculan argumen '-v'. Seseorang dapat mengabaikan semua kemunculan '-v' lainnya dengan cukup mudah.
Tapi, memungkinkan beberapa kemunculan argumen nyaman digunakan dalam situasi seperti:
Kami tidak peduli tentang urutan argumen, dan bahkan mengizinkan beberapa argumen -u. Ya, mengizinkan juga:
sumber
$*
tidak boleh digunakan dalam konteks ini: Ini menggabungkan item menjadi string yang merupakan string-split dan glob-expand; tidak seperti"$@"
, yang meninggalkan item dengan nilai aslinya yang tepat. Dan Anda kehilangan beberapa kutipan, yang akan ditangkap shellcheck.net (dengan peringatan yang ditautkan ke halaman wiki yang menjelaskan mengapa kutipan itu penting).-U'Bob Barker'
;for arg in $*
akan melihatnya sebagai-UBob
dan kemudianBarker
sebagai item terpisah; sedangkanfor item in "$@"
akan terlihat-UBob Barker
sebagai string tunggal.