zsh 条件式でのパターンマッチング

zsh 条件式でのパターンマッチング

zsh のフック関数のパターンマッチングで問題が発生していますprecmd。次のとおりです。

precmd(){
   local x='test'
   if [ $x = '*test*' ]; then
      echo 'hello'
   fi
}

hello は一度も出力されません。このコードを通常の方法でテストしたところzsh test.zsh、問題なく動作しました。また、正規表現なしでも試したところprecmd、問題なく出力されました。なぜこれが期待どおりに動作しないのか、何か手がかりはありますか?

$ zsh --version
zsh 4.3.11 RHEL 

答え1

[ $x = '*test*' ]を展開した結果の文字列 が$x、をtext展開した結果の文字列 と等しいかどうかをテストします。'*test*'*text*

変数の値がx一致するかどうかをテストするにはパターン *test*=、または==演算子を使用する必要がありますzsh 条件式、内に書かれている二重括弧 [[ … ]]さらに、パターン内の特殊文字は引用符で囲まない必要があります。そうでない場合は、特殊文字自体を意味します。つまり、

if [[ $x == *test* ]]; then …

条件式の構文は、単一の括弧内で使用できる式の構文に似ています[ … ]が、同一ではありません。[は通常のコマンドのように解析されます。実際、これは1文字の名前を持つ組み込みコマンドであり、test組み込みただし、[末尾に追加の引数が必要であり、これは でなければなりません][[ … ]]は、内部にシェルの特殊文字を含めることができる独特の文法構造です。は、一致するファイル名のリスト (グロブ) に[ $x = *test* ]展開され、組み込み関数はその結果を解析することになります。は、グロブを呼び出さない条件式解析の一部として解析されます。*test*test[[ $x = *test* ]]*test*

答え2

*test*は有効な正規表現パターンではありません。 は*繰り返し演算子であり、繰り返すものが必要です。.*test.*が必要な場合が多いですが、正規表現ではデフォルトでアンカーされていないため、これは必要ありません。 を探すだけで済みます。test

ただし、正規表現パターンを演算子で一致させることはできないので=、 が必要です=~

precmd () {
   local x=test
   if [[ $x =~ test ]]; then
      echo 'hello'
   fi
}

関連情報