詳細

詳細

する

if [[ "$1" = pattern ]]; then
    hook
fi

いつも行動する

case "$1" in
    pattern) hook;;
esac

それとも落とし穴がありますか?

答え1

はい、(ほぼ)全く同じです。


詳細

構成内部[ … ]:

演算子=(POSIX以外のオプションも含む==)は、パターン一致ではなく文字列一致をテストします。

構成内部[[ ]](man bashから):

==と!=演算子を使用すると、演算子の右側の文字列はパターンとして扱われますルール以下に説明するようにパターンマッチング中。シェルの場合optionnocasematch有効な場合は一致します。特別な状況に関係なく実行 アルファベット文字。文字列がパターン(==)と一致するか一致しない場合(!=)戻り値は0、そうでない場合は戻り値は1です。パターンの一部を引用して、強制的に文字列に一致させることができます。

設定内部case(man bashで編集して強調表示):

[ [(] パターン[ | パターン] ... ) リストの大文字と小文字の単語 ] ... esac
... 同じ一致を使用して、順番に各パターンと一致させてみます。ルールについてはパス名拡張(下記のパス名拡張を参照してください)。 ...検査された各パターンは、チルダ拡張、引数および変数拡張、算術置換、コマンド置換、およびプロセス置換を使用して拡張されます。シェルの場合optionnocasematch有効な場合は一致を実行します。イベントを考慮しないでください。アルファベット文字。

Pattern MatchingbashのマニュアルではPathname Expansion同じ意味を持ちます。

ドキュメントに表示される唯一の違いは次のとおりです。

`[[ … ]]`                                   case
tilde  expansion                            tilde expansion
parameter and variable expansion            parameter and variable expansion
arithmetic expansion                        arithmetic substitution
command substitution                        command substitution
process substitution                        process substitution
quote removal

quote removalこれはケース構成に明示的にリストされていません。
どのように機能するかは、次のものと正確に一致します(の場合[[ … ]])。

パターンの一部を引用して、強制的に文字列に一致させることができます。

これを使って最後の点をテストします(今度は変数いいえ1つのモード):

case "$1" in
  "$pattern") echo case match
esac

なぜほとんど?

  1. 暗黙的extglob:

    ~からバッシュバージョン4.3

    "==" および "!=" 演算子を使用する場合は、演算子の右側の文字列をパターンとして処理し、パターンの一致で説明されている規則に従って一致します。extglobシェルオプションが有効になっているのと同様

    これはオプションで使用されるモードを意味します。extglob 未設定[[Bash バージョン 4.3 以降では、Case ステートメントと構成は内部的に異なる動作をします。

  2. 暗黙的|:

    Caseの構文は次のとおりです。

    case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
    

    |これは、(OR)で区切られた複数のパターンがある可能性があることを意味します。

    このように:

    shopt -s extglob;      p1="+([0-9])";       p2="+([abcde])"
    
    case "$1" in
        $p1|$p2)    echo "or case match" ; ;;
    esac
    

    これは、orabcdeなどの数字のみまたは文字のみを含む文字列と一致しますが、orは一致しません。1234aabee12ab23

    Aは[[次のように同じように機能します。正規表現(var p3を参照)以下を使用してください。

    #!/bin/bash
    
    shopt -s extglob           ### Use extended globbing.
    shopt -s globasciiranges   ### The range [a-z] will expand to [abcdefghijklmnopqrstuvwxyz].
    
    pattern="+([0-9])"
    p1="+([0-9])"
    p2="+([a-z])"
    p3="^([0-9]+|[a-z]+)$"
    
    case "$1" in
        $pattern)   echo case1 match ; ;&
        $p1|$p2)    echo case2 match ; ;;
    esac
    
    [[ "$1" == $pattern ]] && echo if1 match
    [[ "$1" =~ $p3 ]] && echo if2 match
    

関連情報