bash字符串与多个正确值进行比较

时间:2014-01-16 09:05:48

标签: string bash comparison compare

我有以下的bashscript:

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 ] 但没有任何作用。 有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:58)

如果主要目的是检查列表中是否找不到提供的值,也许您可​​以通过"等号和#34;使用BASH内置的扩展正则表达式匹配。运算符(另请参阅this answer):

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

度过愉快的一天

答案 1 :(得分:39)

也许你应该更好地使用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

答案 2 :(得分:33)

而不是说:

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

说:

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

您可能还想引用Conditional Constructs

答案 3 :(得分:6)

正如@Renich所建议的(但不幸的是,有一个重要的错别字并未得到修复),您也可以使用扩展的globing进行模式匹配。因此,您可以使用与bash比较中的命令参数(例如ls *.pdf)中的文件匹配相同的模式。

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

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

@的意思是“匹配给定的模式之一”。因此,这基本上是说cms与'wordpress'或'magento'或'typo3'不相等。在正常的正则表达式中,@类似于^(wordpress|magento|typo3)$

Mitch Frazier在Linux Journal上有关于Pattern Matching In BashBash Extended Globbing的两篇好文章。

有关扩展的全局背景的更多信息,请参见Pattern Matching (Bash Reference Manual)

答案 4 :(得分:2)

这是我的解决方案

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