GNU/Linux >> Linux の 問題 >  >> Linux

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

承認された回答:

getoptsを使用して、1つのオプションで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


Linux
  1. 2つのパターン間の(および除外する)行を印刷しますか?

  2. Debian – Debianで2つのディスプレイを使用していますか?

  3. Dh_installinitを使用して1つのパッケージに2つのサービスをインストールすることは可能ですか?どのように?

  1. 最初のセミコロンの後にすべてのセミコロンを置き換える方法は?

  2. 1つのコマンドで2つのファイルタイプをRsyncしますか?

  3. 知っておくべき8つの素晴らしいPerlコマンドライン引数

  1. AWK を使用して 2 つのファイルをマージする方法は?

  2. diff を使用して 2 つのファイルを手動でマージする

  3. 2 人のユーザーが 1 台の PC を同時に共有できますか