POSIX 正規表現は、文字列の最初の出現と一致します。

POSIX 正規表現は、文字列の最初の出現と一致します。

長いオプション( "--option")のみをサポートしたいbashスクリプトがあります。 --option にはオプションで 1 つ以上の引数が含まれます。最初の「--」またはコマンドライン文字列の終わりを除くすべての単語(スペースで区切られたすべての単語)は、「--option-arguments」と見なされます。結果の末尾のスペースは大丈夫です。可能なすべてのオプションは他の関数によって呼び出されるため、最大のパフォーマンスが必要です。したがって、bashループと外部コマンドを避けてください。

「最初の発生」問題が見つかるまで数時間かけて賭けました。この回答これは、POSIX(およびbash)が貪欲ではなく、怠惰な正規表現演算子をサポートしないことを思い出させます。

何をすべきか?

答え1

オプションは文字列として渡されず、次のように渡されるため、正規表現を使用して任意の方法でオプションを解析することはできません。リストひも。 、、、、および別の引数がmyscript --option foo bar -- quxあり、スペースは含まれていません。myscript--optionfoobar--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"

関連情報