Ada getopt
perintah di baris perintah bash. getopt
dapat digunakan dengan opsi pendek (seperti getopt -o axby "$@"
), dan dapat digunakan dengan opsi pendek dan panjang (seperti getopt -o axby -l long-key -- "$@"
), tapi sekarang saya hanya perlu opsi panjang (yaitu opsi pendek tidak ada sama sekali), namun perintahnya getopt -l long-key -- "$@"
tidak --long-key
Opsi parse dengan benar. Jadi bagaimana saya bisa menggunakan getopt
perintah dengan hanya opsi panjang? Atau tidak mungkin atau hanya bug dari getopt
perintah?
13
getopts
, tetapi Anda menggunakan/usr/bin/getopt
perintah.Jawaban:
getopt
baik-baik saja dengan tidak memiliki opsi pendek. Tetapi Anda harus mengatakan bahwa Anda tidak memiliki opsi pendek. Ini adalah kekhasan dalam sintaksis - dari manual:Itulah yang terjadi dalam pengujian Anda:
getopt -l long-key -- --long-key foo
memperlakukan--long-key
sebagai daftar opsi-egklnoy
danfoo
sebagai satu-satunya argumen. Menggunakanmisalnya
sumber
getopts
dangetopt
menginfeksi jawaban Anda? Anda mulai dengan berkomentargetopts
lalu hanya menyebutkangetopt
.getopt
program dari GNU coreutils yang merupakan pertanyaannya. Saya telah memperbaiki teks yang mengatakangetopts
. Terima kasih.getopts
bahkan tidak melakukan opsi panjang, jadi semua ini tidak berlakugetopts
.getopts
tag. Saya tidak ingin mengubah jawaban Anda, karena Anda biasanya tahu lebih baik daripada saya tentang apa yang Anda tulis :-)Tidak tahu tentang
getopt
tetapigetopts
builtin dapat digunakan untuk menangani hanya opsi panjang seperti ini:Tentu saja, sebagaimana adanya, itu tidak berfungsi jika opsi-opsi panjang seharusnya memiliki argumen. Itu bisa dilakukan, tetapi, karena saya sudah belajar mengerjakan ini. Sementara saya awalnya termasuk di sini saya menyadari bahwa untuk opsi lama tidak memiliki banyak utilitas. Dalam hal ini hanya memperpendek
case
(match)
bidang saya dengan satu karakter yang dapat diprediksi. Sekarang, yang saya tahu, itu sangat baik untuk opsi pendek - ini sangat berguna ketika looping pada string yang panjangnya tidak diketahui dan memilih byte tunggal sesuai dengan option-string-nya. Tetapi ketika pilihannya adalah arg, tidak banyak yang Anda lakukan denganfor var do case $var in
kombinasi yang bisa dilakukan. Lebih baik, saya pikir, untuk membuatnya tetap sederhana.Saya menduga hal yang sama berlaku
getopt
tetapi saya tidak cukup tahu tentang hal itu untuk mengatakan dengan pasti. Dengan susunan arg berikut, saya akan menunjukkan parser arg kecil saya sendiri - yang terutama tergantung pada hubungan evaluasi / penugasan yang saya hargai untukalias
dan$((shell=math))
.Itulah string arg yang akan saya gunakan. Sekarang:
Itu memproses array arg dalam salah satu dari dua cara berbeda tergantung pada apakah Anda menyerahkannya satu atau dua set argumen yang dipisahkan oleh
--
pembatas. Dalam kedua kasus itu berlaku untuk urutan pemrosesan ke array arg.Jika Anda menyebutnya seperti:
Urutan pertama bisnisnya adalah menulis
acase()
fungsinya agar terlihat seperti:Dan di sebelah
shift 3
. Substitusi perintah dalamacase()
definisi fungsi dievaluasi ketika shell panggilan membangun input fungsi di sini-dokumen, tetapiacase()
tidak pernah dipanggil atau didefinisikan dalam shell panggilan. Meskipun demikian, ini disebut dalam subkulit, jadi dengan cara ini Anda dapat menentukan opsi menarik secara dinamis pada baris perintah.Jika Anda memberikannya array yang tidak dibatasi itu hanya diisi
acase()
dengan kecocokan untuk semua argumen yang dimulai dengan string--
.Fungsi ini praktis memproses semua dalam subkulit - iteratif menyimpan masing-masing nilai arg ke alias ditugaskan dengan nama asosiatif. Ketika itu melalui itu mencetak setiap nilai yang disimpan dengan
alias
- yang POSIX ditentukan untuk mencetak semua nilai yang disimpan dikutip sedemikian rupa sehingga nilai-nilai mereka dapat dikembalikan ke shell. Jadi ketika saya melakukannya ...Outputnya terlihat seperti ini:
Saat berjalan melalui daftar arg itu memeriksa blok kasus untuk pertandingan. Jika menemukan kecocokan di sana ia melempar bendera -
f=optname
. Sampai sekali lagi menemukan opsi yang valid itu akan menambahkan setiap argumen berikutnya ke array yang dibangun berdasarkan bendera saat ini. Jika opsi yang sama ditentukan beberapa kali hasilnya akan bertambah dan tidak menimpa. Apa pun yang tidak dalam kasus - atau argumen berikut opsi yang diabaikan - ditugaskan ke array yang diabaikan .Outputnya diamankan dengan shell untuk input shell secara otomatis oleh shell, dan karenanya:
... harus benar-benar aman. Jika karena alasan apa pun tidak aman, maka Anda mungkin harus mengajukan laporan bug dengan pengelola shell Anda.
Ini menetapkan dua jenis nilai alias untuk setiap pertandingan. Pertama, ia menetapkan sebuah bendera - ini terjadi terlepas dari suatu opsi mendahului argumen yang tidak cocok. Jadi setiap kejadian
--flag
dalam daftar arg akan memicuflag=1
. Ini tidak majemuk ---flag --flag --flag
hanya mendapatflag=1
. Nilai ini memang bertambah - untuk setiap argumen yang mungkin mengikutinya. Ini dapat digunakan sebagai kunci indeks. Setelah melakukan hal dieval
atas saya dapat melakukan:...mendapatkan...
Dan sebagainya:
KELUARAN
Dan untuk argumen yang tidak cocok saya akan mengganti diabaikan di
for ... in
bidang di atas untuk mendapatkan:sumber