bash で getopts を使用して複数のオプション引数を指定する

bash で getopts を使用して複数のオプション引数を指定する

私はgetoptsbash を使用してコマンドライン引数を処理しようとしています。要件の 1 つは、任意の数のオプション引数 (引用符を使用せずに) を処理することです。

1 番目の例 (最初の引数のみ取得)

madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a

2番目の例(引数を引用せずにこのように動作させたい)

madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c

これを実行する方法はありますか?

これが現在のコードです:

#!/bin/bash
while getopts ":s:" opt; do
    case $opt in
    s) echo "-s was triggered" >&2
       args="$OPTARG"
       echo "Argument: $args"
       ;;
       \?) echo "Invalid option: -$OPTARG" >&2
       ;;
    :) echo "Option -$OPTARG requires an argument." >&2
       exit 1
       ;;
    esac
done

この方法で複数のフラグをサポートしたいことに注意してください。例:

madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4

答え1

それぞれの引数に-sを使用するのが最善の方法だと思います。つまり-s foo -s bar -s bazしかしそれでも、一つの選択肢に対して複数の議論を支持したいのであれば、ない使用getopts

次のスクリプトをご覧ください。

#!/bin/bash

declare -a sargs=()

read_s_args()
{
    while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}

while (($#)); do
    case "$1" in
        -s) read_s_args "${@:2}"
    esac
    shift
done

printf '<%s>' "${sargs[@]}"

-sが検出されると、read_s_argsコマンド ラインの残りのオプションと引数とともに が呼び出されます。read_s_args次のオプションに到達するまで引数を読み取ります。-s への有効な引数は配列に格納されますsargs

がここにありますサンプル出力:

[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]

関連情報