Dalam kode di bawah ini ketika saya memberikan opsi r
lalu getopts
membutuhkan satu argumen:
while getopts ":hr::l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG " ;;
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
Tapi saya harus memberikan dua argumen setelah -r
pilihan, bukan satu. Apakah ada cara mudah untuk melakukannya?
Jawaban yang Diterima:
Anda tidak dapat melewatkan dua argumen dengan opsi tunggal menggunakan getopts
.
Saya merekomendasikan alternatif berikut:
-
Menempatkan tanda kutip di sekitar beberapa argumen
Dalam hal ini getopts akan memperlakukannya sebagai satu argumen, tetapi Anda akan dapat membaginya nanti. Anda bahkan dapat memasukkan semua argumen ke dalam array sekaligus:
#!/bin/bash while getopts ":hr:l:" opt; do case $opt in r ) echo "Run Numbers - argument = $OPTARG " set -f # disable glob IFS=' ' # split on space characters array=($OPTARG) ;; # use the split+glob operator l ) echo "Latency range - argument = $OPTARG" ;; h ) helptext graceful_exit ;; * ) usage clean_up exit 1 esac done echo "Number of arguments: ${#array[@]}" echo -n "Arguments are:" for i in "${array[@]}"; do echo -n " ${i}," done printf "b n"
Contoh menjalankan:
./script -r "123 456 789"
Dan keluaran:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Gunakan koma (atau karakter pilihan lainnya) sebagai pembatas
./script -r 123,456,789
dan Anda hanya mengganti
IFS=" "
denganIFS=,
dalam kode di atas. Yang itu memiliki keuntungan mengizinkan elemen kosong.
Seperti yang ditunjukkan di bagian komentar, solusi ini dipilih oleh beberapa program umum mis.lsblk -o NAME,FSTYPE,SIZE
. -
Izinkan beberapa
-r
opsiBeberapa
-r
, tetapi masing-masing hanya mengambil satu argumen:./script -r 123 -r 456 -r 789
Kemudian argumen akan ditambahkan ke array satu per satu
array+=("$OPTARG")
Yang satu ini memiliki keuntungan karena tidak memiliki batasan pada karakter apa yang mungkin dikandung elemen.
Yang ini juga digunakan oleh beberapa alat linux standar, mis.awk -v var1=x -v var2=y
.