对单词列表使用 if 语句

对单词列表使用 if 语句

所以我有一个程序(例如,programA),它将给我一个输出,例如:yes, no, maybe, probably, possibly, impossible, banana

我想制作一个脚本,它可以根据该输出执行某些操作,无论它是什么。假设我只需要考虑yes,maybebanana

到目前为止我要做的就是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- 它将匹配等bbebana

#!/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

相关内容