
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*
=
、or==
演算子を使用する必要があります。zsh条件式、含まれる二重括弧 [[ … ]]
。また、パターンの特殊文字は引用符を解決する必要があります。それ以外の場合、特殊文字はそれ自体を表します。したがって:
if [[ $x == *test* ]]; then …
条件式の構文は、単一の角かっこ内で使用できる式の構文と似ています[ … ]
が、同じではありません。[
これは通常のコマンドのように解析され、実際には次の単一文字名を持つ組み込みコマンドです。test
組み込みただし、最後には、内部的にシェル特殊文字を含めることができる固有の構文構造である追加の[
パラメータが必要です]
。一致するファイル名(ワイルドカード)のリストに展開され、組み込み関数は最終的に結果を解析します。条件式解析の一部として解析され、ワイルドカードは呼び出されません。[[ … ]]
[ $x = *test* ]
*test*
test
[[ $x = *test* ]]
*test*
答え2
*test*
有効な正規表現パターンではありません。これは*
反復演算子であり、何かを繰り返す必要があります。.*test.*
これはデフォルトでは固定されていないため、正規表現には必要ありませんが、必要なものである可能性が高くなります。検索してくださいtest
ただし、正規表現パターンを演算子と=
一致させることはできません=~
。
precmd () {
local x=test
if [[ $x =~ test ]]; then
echo 'hello'
fi
}