web-dev-qa-db-ja.com

getoptsを使用して1つのオプションに2つの引数を提供します

以下のコードでオプション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つの引数を渡す必要があります。これを行う簡単な方法はありますか?

10
ramkrishna

getoptsを使用して、単一のオプションで2つの引数を渡すことはできません。

次の代替案をお勧めします。

  1. 複数の引数を引用符で囲みます

    この場合、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
    
  2. 区切り文字としてコンマ(または他の優先文字)を使用します

    ./script -r 123,456,789
    

    そしてあなたはIFS=" "IFS=,上記のコードで。これには、空の要素を許可するという利点があります。コメントセクションで指摘されているように、このソリューションはいくつかの一般的なプログラムによって選択されています。 lsblk -o NAME,FSTYPE,SIZE

  3. 複数を許可-rオプション

    複数-r、ただし、それぞれ1つの引数のみを取る:

    ./script -r 123 -r 456 -r 789
    

    次に、引数が1つずつ配列に追加されます

    array+=("$OPTARG")
    

    これには、要素に含めることができる文字に制限がないという利点があります。これは、一部の標準Linuxツールでも使用されます。 awk -v var1=x -v var2=y

19
jimmij