【问题标题】:Comparing variables with strings bash将变量与字符串 bash 进行比较
【发布时间】:2018-03-17 02:39:30
【问题描述】:

上下文

对于我们的很多CentOS服务器我想安装一些监控软件,该软件是基于CentOS版本的,我想检查发布版本并根据它安装软件。

问题

似乎 if 语句成功运行而没有错误,而结果对于两个或所有三个 if 语句都不应该为真。我查看了 if 命令和测试,看来我应该在 bash 中使用双括号和单 = 符号。我相信我在做一些非常简单的错误,但我就是找不到。

代码

#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"

if [[ "$version"="CentOS release 6.9 (Final)" ]] ; then
    echo "Same versions as expected"
    versionknown=true
    #run commands for this specific version
fi

if [[ "$version"="CentOS Linux release 7.3.1611 (Core)" ]] ; then
    echo "Same versions as expected v2"
    versionknown=true
    #run commands for this specific version
fi


if [[ "$versionknown"=false ]] ; then
    echo "Different version detected than known:"
    echo $version
    echo "Aborted"
fi

echo $versionknown

结果

Same versions as expected
Same versions as expected v2
Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
true

更新

在收到一些回复后,我更改了代码,在等号 (=) 周围添加了空格。仍然不能按预期工作,因为比较应该在第二个 if 语句中返回 true,而它没有。

代码 #2

#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"

if [[ "$version" = "CentOS release 6.9 (Final)" ]] ; then
        echo "Same versions as expected"
        versionknown=true
        #run script for this specific version
fi

if [[ "$version" = "CentOS Linux release 7.3.1611 (Core)" ]] ; then
        echo "Same versions as expected v2"
        versionknown=true
        #run script for this specific version
fi


if [[ "$versionknown" = false ]] ; then
        echo "Different version detected than known:"
        echo $version
        echo "Aborted"
fi

echo $versionknown

结果 #2

Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
false

更新

declare -p version 了解到/etc/centos-release 在脚本文件的末尾添加了一个空格,我相信在 CentOS 版本 6.9 (Final) 上并非如此。在字符串中添加空格,或者一起使用我的 known_version 变量并添加空格可以解决问题,脚本现在可以按预期工作。

【问题讨论】:

    标签: linux bash if-statement string-comparison


    【解决方案1】:

    = 符号周围需要空格;没有它,shell 会将“表达式”视为一个单词,而不是比较两个单词是否相等。

    [[ "$version" = "CentOS release 6.9 (Final)" ]]
    

    [[ a=b ]] 等价于[[ -n a=b ]],也就是说,您只是在测试单个单词是否为非空字符串。

    [[ ... ]] 中使用= 还是== 是风格问题; bash 两者都支持。

    我会完全避免使用versionknown 变量,并编写如下代码:

    version=$(</etc/centos-release)
    known_version1="CentOS release 6.9 (Final)"
    known_version2="CentOS Linux release 7.3.1611 (Core)"
    
    if [[ "$version" = "$known_version1" ]] ; then
        echo "Same versions as expected"
        #run commands for this specific version
    elif [[ "$version" = "$known_version2" ]] ; then
        echo "Same versions as expected v2"
        #run commands for this specific version
    else
        echo "Different version detected than known:"
        echo "$version"
        echo "Aborted"
    fi
    

    case 声明

    case $version in
       "$known_version1")
           echo "Same versions as expected"
           # ...
           ;;
       "$known_version2")
           echo "Same versions as expected v2"
           # ...
           ;;
       *)
          echo "Different version detected than known:"
          echo "$version"
          echo "Aborted"
    esac
    

    【讨论】:

    • 我已经更改了脚本,现在它给出了相同的结果,没有前两行(如帖子中所述),这仍然很奇怪,因为 $version 等于'CentOS Linux 7.3 版。 1611(核心)',因此应该导致第二个 if 语句,而不是第一个或最后一个。有什么想法吗?
    • 如果将echo $version 替换为declare -p version,输出是什么?
    • 就是这样,声明我得到了declare -- version="CentOS Linux release 7.3.1611 (Core) ",它有一个额外的空间。因此 if 语句为假,因为字符串没有空格,在更改第二个语句中的字符串并添加空格后,它按预期工作,谢谢!
    【解决方案2】:

    作为一般经验法则,可能在所有编程语言中,一个等号 (=) 用于赋值,而不是用于相等检查,在这种情况下是双等号 (=)。

    您输入所有if 语句的原因是您的赋值表达式的结果是true,因此if 语句被评估为true 并被执行。

    更新

    感谢@chepner 的评论,当与单方括号[ ] 或双方括号[[ ]] 关联时,使用单个等号(=) 进行相等检查。 bash 还支持在 [ ][[ ]] 两种情况下使用双等号 (=) 作为相等检查。

    你想要的大概是这样的:

    #!/bin/bash
    versionknown=false
    version=$(</etc/centos-release)
    known_version1="CentOS release 6.9 (Final)"
    known_version2="CentOS Linux release 7.3.1611 (Core)"
    
    if [[ "$version" == "CentOS release 6.9 (Final)" ]] ; then
        echo "Same versions as expected"
        versionknown=true
        #run commands for this specific version
    fi
    
    if [[ "$version" == "CentOS Linux release 7.3.1611 (Core)" ]] ; then
        echo "Same versions as expected v2"
        versionknown=true
        #run commands for this specific version
    fi
    
    
    if [[ "$versionknown" == "false" ]] ; then
        echo "Different version detected than known:"
        echo $version
        echo "Aborted"
    fi
    
    echo $versionknown
    

    【讨论】:

    • 一般经验法则不适用于[,其中= 是相等运算符。 ==bash 中的(不必要的)扩展。
    【解决方案3】:

    您在 if 语句中做错了什么。

    简单回答:

    1. 如果要比较字符串,请确保使用==
    2. 请使用if [ "$version" == "xyz" ] 而不是if [[ "$version" = "xyz" ]]

    总结:if [ "$version"=="CentOS release 6.9 (Final)" ]; then 并且成功了!

    问候,弗兰克坦克

    【讨论】:

    • = [的字符串相等运算符; ==bash 支持,但不支持其他 shell。如果您觉得需要使用==,请改用[[ 命令。
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2015-10-03
    • 2015-11-21
    • 2018-05-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多