Bash

超過 4 個解析器參數的 getopts

  • October 7, 2022

我想使用下面的程式碼在腳本中解析多個getopts參數bash

while getopts b:B:m:M:T flag
do
   case "${flag}" in
       b) rbmin=${OPTARG};;
       B) rbmax=${OPTARG};;
       m) mbmin=${OPTARG};;
       M) mbmax=${OPTARG};;
       T) sigType=${OPTARG};;
   esac
done
echo $rbmin,$rbmax,$mbmin,$mbmax, $sigType
[amit@amitk]$ sh pass.sh -b 0.1 -B 0.3  -m 10 -M 11 -T sig 
0.1,0.3,10,11,

我不知道為什麼我不能傳遞超過四個參數。有什麼建議麼?

您似乎:T給定的選項字元串中缺少getopts. 這:表明-T需要一個選項參數。

沒有:,-T將是一個沒有參數的選項,並且您的呼叫將sig作為操作數留在命令行末尾,而不是作為選項參數。

while getopts b:B:m:M:T: flag
do
   case $flag in
       b) rbmin=$OPTARG        ;;
       B) rbmax=$OPTARG        ;;
       m) mbmin=$OPTARG        ;;
       M) mbmax=$OPTARG        ;;
       T) sigType=$OPTARG      ;;
       *) echo error >&2
          exit 1
   esac
done
shift "$(( OPTIND - 1 ))"

echo "$rbmin,$rbmax,$mbmin,$mbmax, $sigType"

if [ "$#" -gt 0 ]; then
       printf 'Other operands: %s\n' "$*"
fi

測試:

$ sh script -b 0.1 -B 0.3  -m 10 -M 11 -T sig
0.1,0.3,10,11, sig
$ sh script -b 0.1 -B 0.3  -m 10 -M 11 -T sig hello bumblebee
0.1,0.3,10,11, sig
Other operands: hello bumblebee

另請注意,如果您使用顯式解釋器(如sh)執行腳本,則可能不會使用bash. 我之所以提到這一點,是因為您bash在問題中提到了“腳本”。在這種情況下,可以,因為腳本不需要 bash,但最好使用#!頂部帶有正確 - 行的執行檔。

引用自:https://unix.stackexchange.com/questions/720116