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


10

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

回答:


20

を使用して、単一のオプションで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")

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


3
カンマ区切りのアイデアは、さまざまな標準コマンド、特にで使用されるため、優れていますmount
PM 2Ring 2014年

可能な場合でも、この「区切り」形式をを使用して配列に変換できarray=(${OPTARG//,/ })ます。さらに別の可能性は-r arg、配列に要素を追加するたびに複数回オプションを使用することarray+=($OPTARG)です。
jimmij 2014年

さらに簡単:IFS=',' array=($OPTARG)
PM 2Ring 2014年

例:pgrepカンマを使用しますps -s 123,456 ...、grepを使用オプションを繰り返す:grep -e pattern1 -e pattern2 ...-e1パターンのみが使用される場合オプションです)。
Volker Siegel

2
使用している言語/ライブラリの制限のために、リストを引用符で囲むなど、ユーザーにもっと仕事をさせたくない場合。ただし、の使用は,合理的であり、スペースの使用よりも好ましいと思われます。
ctrl-alt-delor 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.