する
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 Matching
bashのマニュアルでは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
なぜほとんど?
暗黙的
extglob
:~からバッシュバージョン4.3
"==" および "!=" 演算子を使用する場合は、演算子の右側の文字列をパターンとして処理し、パターンの一致で説明されている規則に従って一致します。extglobシェルオプションが有効になっているのと同様。
これはオプションで使用されるモードを意味します。
extglob
未設定[[
Bash バージョン 4.3 以降では、Case ステートメントと構成は内部的に異なる動作をします。暗黙的
|
: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
これは、or
abcde
などの数字のみまたは文字のみを含む文字列と一致しますが、orは一致しません。1234
aabee
12a
b23
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