以下のコードを実行すると、マイコンピュータで検出されますが、私のオフィスコンピュータで同じコマンドを実行すると検出されません。このあいまいな動作の理由は何ですか?
$ pはテキストファイルの1行で、 xyzxyz if ( abc )
読み込み中にgrepに行を渡すために使用されます。
grep -qw -e 'if(' -e 'if' <<< $p
if [ $? -ne 0 ]; then
do something
fi
答え1
以前のバージョンには対応するbash
バグ/無効な機能がありました。
cat <<< $var
の内容は$var
単語に分割されますが(ワイルドカードで区切られていません)、結果の単語はスペースで連結された次のコマンドへの入力として設定された一時ファイルに保存されますcat
。
<<<
これは、このzsh演算子をサポートする他のシェルとの整合性を維持するためにbash-4.4で修正されました。
以前のバージョンでは、これは変数を参照する必要がある別のケースです。
したがって、以下を$IFS
含めると違いを説明できます。i
f
$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if
とにかく、-e 'if('
テキストにif(
単語が含まれている場合はif
単語も含まれるため、重複することに注意してください。
また、bash
正規表現一致機能が組み込まれているので、いつでも次のことができます。
re='\<if\>'
if [[ $p =~ $re ]]; then
printf '"%s" contains a "if" word\n' "$p"
fi
(少なくともLinux MintやRHELなどのシステムではEREにありますが、\<
サポートしている場合は\>
EREにはあります。grep
-w
\<
\>
(上記の場合は、引用が不要な非常にまれなケースの1つです$p
(引用しても問題にはなりません)。$re
必然ではない引用符(そうでなければ、内容は正規表現ではなく固定文字列として扱われます)
標準sh
構文を使用して、次のこともできます。
case +$p+ in
(*[^[:alnum:]_]if[^[:alnum:]_]*)
printf '"%s" contains a "if" word\n' "$p"
esac
同じ効果を得るために。