所以我有一个程序(例如,programA
),它将给我一个输出,例如:yes
, no
, maybe
, probably
, possibly
, impossible
, banana
。
我想制作一个脚本,它可以根据该输出执行某些操作,无论它是什么。假设我只需要考虑yes
,maybe
和banana
。
到目前为止我要做的就是case
像这样使用:
case $program_output in
yes) echo "good word: $program_output" ;;
maybe) echo "good word: $program_output" ;;
banana) echo "good word: $program_output" ;;
*) echo "bad word: $program_output" ;;
esac
但最近我在摆弄这个if
声明,发现我可以更快地做到这一点,如下所示:
if [[ "yesmaybebanana" =~ ${program_output} ]]; then
echo "good word: ${program_output}"; else echo "bad word: ${program_output}";
fi
我有什么理由不应该使用该if
声明吗?在这种情况下,$program_output
其中不能有空格,并且它可以输出的单词列表有限。
答案1
如果您想使用 的bash
正则表达式函数(但是它们是bash
特定的,因此不可移植),您至少应该使用正确的“OR”类型运算符来强制与一允许的单词,如
if [[ $program_output =~ ^(yes|maybe|banana)$ ]]
then
echo "Good word: $program_output"
else
echo "Bad word: $program_output"
fi
请注意,正则表达式周围不能有引号,并且单词替代项包含在^
和$
锚点之间,以确保没有子字符串可以触发匹配(例如yessir
否则会被模式捕获yes
)。
答案2
该if
版本不会像case
这里一样可靠,因为它将捕获 - 的所有子字符串yesmaybebanana
- 它将匹配等b
:
bebana
#!/usr/bin/env bash
program_output='bebana'
if [[ "yesmaybebanana" =~ ${program_output} ]]; then echo "good word: ${program_output}"; else echo "bad word: ${program_output}"; fi
输出:
good word: bebana
而且它不可移植 - 尝试用破折号运行它:
$ dash ./a.sh
./a.sh: 6: ./a.sh: [[: not found
bad word: bebana
您可以case
通过在一行中使用多个单词来显着简化您的版本:
case $program_output in
yes | maybe | banana) echo "good word: $program_output" ;;
*) echo "bad word: $program_output" ;;
esac
答案3
巴什的扩展模式也在这里工作:
if [[ $program_output == @(yes|maybe|banana) ]]
then
echo "program output is one of yes, maybe, banana"
fi