将变量与字符串bash

时间:2017-10-05 13:01:07

标签: linux bash if-statement string-comparison

上下文

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

问题

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

代码

#!/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(最终版)中并非如此。添加字符串中的空格,或者一起使用我的known_version变量并添加空格来解决问题,脚本现在可以按预期工作。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

您输入所有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

答案 2 :(得分:-1)

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

简单回答:

  1. 如果要比较字符串,请务必使用==
  2. 请使用if [ "$version" == "xyz" ]代替if [[ "$version" = "xyz" ]]
  3. 总结:if [ "$version"=="CentOS release 6.9 (Final)" ]; then它可以工作!

    问候,FrankTheTank