尝试将输入与包含警告字
的文件进行比较read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
# the wildcards in my expression do not work
if [[ $MYINPUT =~ *$X* ]]
then
echo "#1 matched"
else
echo "#1 nope"
fi
done
答案 0 :(得分:2)
=~
运算符处理正则表达式,因此要按照您的意愿进行通配符匹配,语法如下:
if [[ $MYINPUT =~ .*$X.* ]]
然而,因为这是正则表达式,所以不需要,因为它暗示它可以在字符串中的任何位置(除非它使用^
和/或$
锚定,所以这应该足够了:< / p>
if [[ $MYINPUT =~ $X ]]
请注意,如果您的“单词”恰好包含正则表达式元字符,那么这可能会做一些奇怪的事情。
答案 1 :(得分:1)
我在这里避免使用=~
,因为正如FatalError指出的那样,它会将$X
解释为正则表达式,这可能会导致令人惊讶的错误(特别是因为它是一个扩展的正则表达式,所以它有比标准grep语法更特殊的字符。)
相反,您可以使用==
,因为bash将==
的RHS视为一种通用模式:
read MYINPUT
alertWords=($(<"AlertWordList"))
for X in "${alertWords[@]}"
do
# the wildcards in my expression do work :-)
if [[ $MYINPUT == *"$X"* ]]
then
echo "#1 matched"
else
echo "#1 nope"
fi
done
我还在alertWords
作业中删除了cat的使用,因为它将文件读取保留在shell中,而不是产生另一个进程来执行它。
答案 2 :(得分:0)
如果您想使用模式而不是匹配的正则表达式,可以使用case
:
read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
# the wildcards in my expression do not work
case "$MYINPUT" in
*$X* ) echo "#1 matched" ;;
* ) echo "#1 nope" ;;
esac
done