Answers:
这是一个使用正则表达式的仅Bash(> =版本3)解决方案:
if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then
echo "$WORD is in the list"
else
echo "$WORD is not in the list"
fi
如果单词列表很长,可以将其存储在文件中(每行一个单词),然后执行以下操作:
if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then
echo "$WORD is in the list"
else
echo "$WORD is not in the list"
fi
文件方法的一个警告:
如果文件带有空格,它将中断。可以通过以下方式补救:
sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin
感谢@terdon提醒我正确使用^
和锚定模式$
。
[[
和]]
- [
并且]
还不够。
[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
if (echo "$set" | fgrep -q "$WORD")
$WORD
为空,它将返回true ,如果WORD=ca
或WORD=og
或类似,它将匹配,我认为您的意思是echo ${set[@]}
。
我正在寻找一种“单行”解决方案来验证我的脚本参数,并使用上述的Joseph R.答案得出了:
[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
您可能希望将单词列表放入文件中,以防您经常更改列表,或者希望它被多个脚本共享。如果列表太长而无法在脚本中进行管理,则可能需要将单词放入文件中。那你可以说
if fgrep –qx "$WORD" word_list
您可以使用fgrep指定所有允许的单词:
if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then
echo yes
else
echo no
fi
该-w
标志仅匹配完整的单词,该-q
标志使其静默运行(因为我们需要的只是要使用的if语句的返回值),并且每个-e
模式都指定一个允许的模式。
fgrep
是执行常规字符串匹配而不是正则表达式匹配的grep版本。如果你有grep
,你应该有fgrep
,但如果不是,它等同于使用grep
与-F
标志(这样你就只需更换fgrep -wq
以上grep -Fwq
)。
shopt -s nocasematch
可能会帮助,如果你希望搜索不区分大小写。