以下のコードでオプション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
オプションの後に、1つではなく2つの引数を渡す必要があります。これを行う簡単な方法はありますか?
getopts
を使用して、単一のオプションで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
。