Shell-Script
使用 getopts 為一個選項提供兩個參數
在下面的程式碼中,當我給出選項時
r
需要getopts
一個參數: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
但是我需要在
-r
選項之後傳遞兩個參數,而不是一個。是否有捷徑可尋?
您不能使用單個選項傳遞兩個參數
getopts
。我推薦以下替代方案:
在多個參數周圍加上引號
在這種情況下,getopts 會將它們視為一個參數,但您稍後可以將其拆分。您甚至可以一次將所有參數放入數組中:
#!/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"
執行範例:
./script -r "123 456 789"
並輸出:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
使用逗號(或其他首選字元)作為分隔符
./script -r 123,456,789
你只需在上面的程式碼中
IFS=" "
替換為。IFS=,
那個具有允許空元素的優點。正如評論部分所指出的,這個解決方案是由一些常見的程序選擇的,例如lsblk -o NAME,FSTYPE,SIZE
。 3. ### 允許多個-r
選項多個
-r
,但每個只接受一個參數:./script -r 123 -r 456 -r 789
然後參數將被一一添加到數組中
array+=("$OPTARG")
這樣做的好處是對元素可能包含的字元沒有限制。這個也被一些標準的 linux 工具使用,例如
awk -v var1=x -v var2=y
.