Saya tahu bahwa saya dapat dengan mudah mendapatkan parameter yang diposisikan seperti ini di bash:
$0
atau $1
Saya ingin dapat menggunakan opsi flag seperti ini untuk menentukan untuk apa setiap parameter digunakan:
mysql -u user -h host
Apa cara terbaik untuk mendapatkan -u param
nilai dan -h param
nilai berdasarkan bendera, bukan oleh posisi?
Jawaban:
Ini adalah ungkapan yang biasa saya gunakan:
Poin utamanya adalah:
$#
adalah jumlah argumensumber
--action*
dan--output-dir*
kasing kasus?--action=[ACTION]
dan halnya di mana seseorang mengetik--action [ACTION]
*)
Anda istirahat di sana, tidak seharusnya Anda keluar atau mengabaikan opsi yang buruk? Dengan kata lain-bad -o dir
yang-o dir
sebagian tidak pernah diproses.Contoh ini menggunakan
getopts
perintah bawaan Bash dan dari Panduan Gaya Google Shell :Catatan: Jika sebuah karakter diikuti oleh titik dua (misalnya
f:
), opsi itu diharapkan memiliki argumen.Contoh penggunaan:
./script -v -a -b -f filename
Menggunakan getopts memiliki beberapa keunggulan dibandingkan jawaban yang diterima:
-a -b -c
→-abc
)Namun, kerugian besar adalah tidak mendukung opsi lama, hanya opsi satu karakter.
sumber
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;
getopt adalah temanmu .. contoh sederhana:
Seharusnya ada berbagai contoh di direktori / usr / bin Anda.
sumber
/usr/share/doc/util-linux/examples
, paling tidak pada mesin Ubuntu.Saya pikir ini akan menjadi contoh sederhana dari apa yang ingin Anda capai. Tidak perlu menggunakan alat eksternal. Alat Bash bawaan dapat melakukan pekerjaan untuk Anda.
Ini akan memungkinkan Anda untuk menggunakan flag sehingga tidak peduli urutan mana yang Anda lewati parameter Anda akan mendapatkan perilaku yang tepat.
Contoh:
Output:
Anda dapat menambahkan fungsi ini ke profil Anda atau memasukkannya ke dalam skrip.
Terima kasih!
Sunting: Simpan ini sebagai file aa dan kemudian jalankan sebagai
yourfile.sh -last "Adios" -first "Hola"
sumber
./hello.sh DOSOMETHING -last "Adios" -first "Hola"
return 1;
dengan contoh keluaran terakhircan only 'return' from a function or sourced script
pada macOS. Beralih keexit 1;
pekerjaan seperti yang diharapkan.Alternatif lain adalah dengan menggunakan sesuatu seperti contoh di bawah ini yang memungkinkan Anda untuk menggunakan tag --i panjang atau pendek -i dan juga memungkinkan kompilasi -i = "example.jpg" atau metode-metode terpisah lewatii example.jpg untuk menyampaikan argumen .
sumber
Saya suka jawaban Robert McMahan yang terbaik di sini karena tampaknya yang termudah untuk dibuat menjadi file sharable menyertakan untuk skrip Anda untuk digunakan. Tetapi tampaknya memiliki cacat dengan garis
if [[ -n ${variables[$argument_label]} ]]
melemparkan pesan, "variabel: array array yang buruk". Saya tidak punya perwakilan untuk berkomentar, dan saya ragu ini adalah 'perbaikan' yang tepat, tetapi membungkusnyaif
denganif [[ -n $argument_label ]] ; then
membersihkannya.Inilah kode yang akhirnya saya dapatkan, jika Anda tahu cara yang lebih baik, silakan tambahkan komentar pada jawaban Robert.
Sertakan File "flags-declares.sh"
Sertakan File "flags-arguments.sh"
"Script.sh" Anda
sumber
Jika Anda terbiasa dengan Python argparse, dan tidak keberatan memanggil python ke parse bash argumen, ada sepotong kode yang saya temukan sangat membantu dan super mudah digunakan disebut argparse-bash https://github.com/nhoffman/ argparse-bash
Contoh ambil dari script example.sh mereka:
sumber
Saya mengusulkan TLDR sederhana:; contoh untuk yang belum diinisiasi.
Buat skrip bash bernama helloworld.sh
Anda kemudian dapat melewatkan parameter opsional
-n
saat menjalankan skrip.Jalankan script seperti itu:
Keluaran
Catatan
Jika Anda ingin menggunakan beberapa parameter:
while getops "n:" arg: do
dengan lebih banyak paramaters sepertiwhile getops "n:o:p:" arg: do
o) Option=$OPTARG
danp) Parameter=$OPTARG
sumber
Simpan sebagai sample.sh dan coba jalankan
di terminal Anda.
sumber
Saya mengalami masalah menggunakan getop dengan banyak flag, jadi saya menulis kode ini. Ia menggunakan variabel modal untuk mendeteksi flag, dan menggunakan flag tersebut untuk menetapkan argumen ke variabel.
Perhatikan bahwa, jika sebuah bendera tidak boleh memiliki argumen, sesuatu selain pengaturan CURRENTFLAG dapat dilakukan.
sumber
Jadi ini dia solusinya. Saya ingin dapat menangani boolean flag tanpa tanda hubung, dengan satu tanda hubung, dan dengan dua tanda hubung serta penugasan parameter / nilai dengan satu dan dua tanda hubung.
Beberapa referensi
declare
do$ bash -c "help declare"
.shift
do$ bash -c "help shift"
.sumber