90

このmanページには、caseステートメントで「ファイル名展開パターン マッチング」が使用されていると書かれています。
通常、いくつかのパラメーターに短い名前を付けたいので、次のようにします。

case $1 in
    req|reqs|requirements) TASK="Functional Requirements";;
    met|meet|meetings) TASK="Meetings with the client";;
esac

logTimeSpentIn "$TASK"

req*またはのようなパターンを試してみme{e,}tましたが、ファイル名展開のコンテキストでこれらの値に一致するように正しく展開されると理解していますが、機能しません。

4

3 に答える 3

180

ブレース展開は機能しませんが*、機能?[]ます。設定すると、拡張パターン マッチングshopt -s extglobも使用できます。

  • ?()- パターンの 0 回または 1 回の出現
  • *()- パターンのゼロ回以上の出現
  • +()- パターンの 1 つ以上の出現
  • @()- パターンの 1 回の出現
  • !()- パターン以外のもの

次に例を示します。

shopt -s extglob
for arg in apple be cd meet o mississippi
do
    # call functions based on arguments
    case "$arg" in
        a*             ) foo;;    # matches anything starting with "a"
        b?             ) bar;;    # matches any two-character string starting with "b"
        c[de]          ) baz;;    # matches "cd" or "ce"
        me?(e)t        ) qux;;    # matches "met" or "meet"
        @(a|e|i|o|u)   ) fuzz;;   # matches one vowel
        m+(iss)?(ippi) ) fizz;;   # matches "miss" or "mississippi" or others
        *              ) bazinga;; # catchall, matches anything not matched above
    esac
done
于 2010-12-29T16:48:48.110 に答える
48

中括弧は使えないと思います。

Conditional Constructsの case に関する Bash のマニュアルによると。

パターンは、チルダ展開、パラメーター展開、コマンド置換、および算術展開を受けます。

残念ながらブレース拡張については何もありません。

したがって、次のようにする必要があります。

case $1 in
    req*)
        ...
        ;;
    met*|meet*)
        ...
        ;;
    *)
        # You should have a default one too.
esac
于 2010-12-29T14:25:55.607 に答える