getopts
bashを使用してコマンドライン引数を処理しようとしています。要件の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$]