【问题标题】:Bash comparison operator always trueBash 比较运算符始终为真
【发布时间】:2016-07-10 23:56:17
【问题描述】:

我正在尝试编写一个小脚本来比较我的外部 IP(前三个字节)和下面的:

#!/bin/bash
MYFILE=/home/me/.config/i3/pia
while true
do
    IP_EX=$(wget http://ipinfo.io/ip -qO - | cut -d"." -f1,2,3) 
    if [[ "$IP_EX"=="173.199.65" ]]
    then
        echo file created
        touch $MYFILE 
    else
        echo file deleted
        rm -f $MYFILE   
    fi
    echo sleeping
    sleep 4
done

这总是返回file created,并且永远不会执行 else 语句。如果我用whatever 替换$IP_EX甚至就是这种情况。这是为什么呢?

【问题讨论】:

  • 仍然返回为真:/

标签: bash if-statement compare


【解决方案1】:

Bash 命令对空格很敏感。您需要在== 周围添加空格。

请注意,这给出了错误的答案:

$ IP_EX=abc; [[ "$IP_EX"=="173.199.65" ]] && echo True
True

相比之下,这个带有空格的版本可以正常工作:

$ IP_EX=abc; [[ "$IP_EX" == "173.199.65" ]] && echo True
$ 

问题在于 bash 将 "$IP_EX"=="173.199.65" 视为单个字符串。当给定这样一个参数时,[[ 如果字符串不为空,则返回 true,如果为空,则返回 false:

$ [[ "" ]] && echo True
$ [[ "1" ]] && echo True
True

添加空格后,bash 将"$IP_EX" == "173.199.65" 视为三个参数,中间参数为==。因此,它测试是否相等。这就是你想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2016-07-22
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多