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

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

以下のコードでは、オプションを提供するときに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ただし、オプションの後に1つではなく2つのパラメータを渡す必要があります。見つけることができるショートカットがありますか?

ベストアンサー1

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

次の選択肢をお勧めします。

  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")
    

    これの利点は、要素に含めることができる文字に制限がないことです。このツールはawk -v var1=x -v var2=y

おすすめ記事