以下のコードでは、オプションr
を指定すると 次にgetopts
1つの引数が必要です:
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
の後に2つの引数を渡す必要があります 1つではなくオプション。これを行う簡単な方法はありますか?
承認された回答:
getopts
を使用して、1つのオプションで2つの引数を渡すことはできません 。
次の選択肢をお勧めします:
-
複数の引数を引用符で囲みます
この場合、getoptsはそれらを1つの引数として扱いますが、後で分割することができます。すべての引数を一度に配列に入れることもできます:
#!/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
。 -
複数の
-r
を許可する オプション複数の
-r
、ただし、それぞれが1つの引数のみを取ります:./script -r 123 -r 456 -r 789
次に、引数が1つずつ配列に追加されます
array+=("$OPTARG")
これには、要素に含まれる可能性のある文字に制限がないという利点があります。
これは、いくつかの標準的なLinuxツールでも使用されます。awk -v var1=x -v var2=y
。