如何将一个字符串与 Bash 中的多个正确值进行比较



我有以下一段 Bash 脚本:

function get_cms {
    echo "input cms name"
    read cms
    cms=${cms,,}
    if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
        get_cms
    fi
}

但是无论我输入什么(正确和不正确的值),它都不会再次调用该函数,因为我只想允许这 3 个输入中的 1 个。

我已经用||[ var != value ] or [ var != value1 ] or [ var != value1 ]试过了,但没有任何效果。

有人可以指出我正确的方向吗?

如果主要目的是检查是否在列表中找不到提供的值,也许您可以通过"相等波浪号"运算符使用 BASH 中内置的扩展正则表达式匹配(另请参阅此答案):

if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi

也许你最好对这样的列表使用case

case "$cms" in
  wordpress|meganto|typo3)
    do_your_else_case
    ;;
  *)
    do_your_then_case
    ;;
esac

我认为对于长这样的列表,这更易读。

如果您仍然喜欢if可以通过两种方式使用单括号

if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then

if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then

而不是说:

if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then

说:

if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then

您可能还想参考条件构造。

正如@Renich所建议的,您还可以使用扩展通配进行模式匹配。因此,您可以使用与命令参数中的文件匹配相同的模式(例如 ls *.pdf )在bash比较中。

对于您的特定情况,您可以执行以下操作。

if [[ "${cms}" != @(wordpress|magento|typo3) ]]

@表示"匹配给定模式之一"。所以这基本上是说cms不等于"wordpress"或"magento"或"typo3"。在正常的正则表达式语法中,@类似于^(wordpress|magento|typo3)$

Mitch Frazier 在 Linux Journal 上有两篇关于 Bash 中的模式匹配和 Bash 扩展通配的好文章。

有关扩展通配的更多背景信息,请参阅模式匹配(Bash 参考手册)。

这是我

的解决方案

if [[ "${cms}" != @(wordpress|magento|typo3) ]]; then

相关内容

  • 没有找到相关文章

最新更新