Bash比较运算符始终为true

时间:2016-07-10 23:56:18

标签: bash if-statement compare

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

CREATE PROCEDURE Punch
(
    @idEmployee INT
)
AS
BEGIN
    SET NOCOUNT ON

    IF((SELECT statut FROM Employee WHERE idEmployee = @idEmployee) = 1)
    BEGIN TRY
        --If there is an active punch
        IF((SELECT TOP 1 punchOut FROM Punchs WHERE idEmployee = @idEmployee) = NULL)
        BEGIN
            --If the punch is the same date than the punchIn
            IF("Day is today") -- <- i have trouble here
                UPDATE Punchs SET punchOut = GETDATE() WHERE idEmployee = @idEmplyee
            --If the punch is in a different day
            ELSE
            BEGIN
                INSERT INTO Punchs(idEmployee, punchIn) VALUES (@idEmployee, GETDATE())
                EXEC SendPunchError(@idEmployee)
            END
        END
        --If there are no active punch
        ELSE
        BEGIN
            INSERT INTO Punchs(idEmployee, punchIn) VALUES (@idEmployee, GETDATE())
        END
    END TRY
    BEGIN CATCH
        RETURN -1
    END CATCH
END

这将永远返回'file created',而else语句永远不会被执行。如果我用“无论什么”替换$ IP_EX,就是这种情况。

1 个答案:

答案 0 :(得分: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"视为三个参数,中间参数为==。因此,它测试平等。这就是你想要的。