長いオプション( "--option")のみをサポートしたいbashスクリプトがあります。 --option にはオプションで 1 つ以上の引数が含まれます。最初の「--」またはコマンドライン文字列の終わりを除くすべての単語(スペースで区切られたすべての単語)は、「--option-arguments」と見なされます。結果の末尾のスペースは大丈夫です。可能なすべてのオプションは他の関数によって呼び出されるため、最大のパフォーマンスが必要です。したがって、bashループと外部コマンドを避けてください。
「最初の発生」問題が見つかるまで数時間かけて賭けました。この回答これは、POSIX(およびbash)が貪欲ではなく、怠惰な正規表現演算子をサポートしないことを思い出させます。
何をすべきか?
答え1
オプションは文字列として渡されず、次のように渡されるため、正規表現を使用して任意の方法でオプションを解析することはできません。リストひも。 、、、、および別の引数がmyscript --option foo bar -- qux
あり、スペースは含まれていません。myscript
--option
foo
bar
--
qux
ループはbashのメソッドです。
case "$1" in
--option1)
shift
while [[ $# -ne 0 && "$1" != "--" ]]; do
option1_args+=("$1")
shift
done
(($# == 0)) || shift
done
パフォーマンスが大きな問題であれば、bashを使用しないでください。 kshを試してください。無料で、ほぼどこでも利用できます。基本的にインストールされていなくても、通常はbashよりはるかに高速です。それでも遅すぎる場合は、Perl、Python、Rubyなどのより高いレベルのプログラミング言語が必要です。
答え2
このやや簡単な解決策を見つけました...
function optionArg () {
local _find="$1"; shift 1
local _optarg=""
local _reBeg=""
#
_reBeg="${_find}"'[= ]+(.*?)( --)?'
### no regex nongreedy operator support in POSIX
### will have to just truncate after first match
#
if [[ "$*" =~ $_reBeg ]]
then
_optarg="${BASH_REMATCH[1]}"
### all arguments following --option[= ]
#
_optarg="${_optarg%%--*}"
### limit to just arguments up to next --option (no lazy support in POSIX)
#
return 0
else
return 1
fi
オプションを含むスクリプトまたは関数呼び出しが与えられ、その後に次のような他のオプションが続きます。
otherfunction --option1 arg1 arg2 --option2 -- file1 /home/me/file2
otherfunction() が許可する各オプションに対して、 optionArg() は次のように呼び出されます。
_optarg1="$(optionArg --option1 "$@")"
_optarg2="$(optionArg --option2 "$@")"
_optarg3="$(optionArg -- "$@")"
結果は次のとおりです。
_optarg1="arg1 arg2 "
_optarg2=""
_optarg3="file1 /home/me/file2"