Bash值对于Base来说太大了,不能在if语句中使用date

时间:2014-11-09 02:31:12

标签: bash

我见过类似的情况,但无法真正弄清楚如何正确地将建议的解决方案应用到我的情况中。

我有一个包含以下行的bash脚本:

LAST=$(ssh root@host ls /backup3/mycomp/partition1/ | tail -1)
    #get last backup dir (formatted YYYY-MM-DD/). If none exist then get yesterdays Date
    if [[ -z "$LAST" || "$LAST" -eq "$TODAY" ]]
            then
                    log "/backup3/$HOST/$NAME/ does not exist, probably first backup or second backup done today."
                    LAST="$YESTERDAY"
    fi

当我运行它时,我收到以下错误:

[[: 2014-11-08: value too great for base (error token is "08")

因为我实际上在搜索物理目录名称,所以我不能删除零。我将如何开展这项工作?

1 个答案:

答案 0 :(得分:2)

替换:

if [[ -z "$LAST" || "$LAST" -eq "$TODAY" ]]

使用:

if [[ -z "$LAST" || "$LAST" == "$TODAY" ]]

由于日期不是有效数字,您希望进行字符串比较(==)而非数字比较(-eq)。

讨论

观察:

$ [[ "10-1" -eq "9" ]] && echo True
True
$ [[ "6+3" -eq "9" ]] && echo True
True

在数值上下文中,发出信号-eq,shell正在对参数进行算术运算。这意味着,对于您的日期2014-11-08,shell正在使用2014,减去11,然后尝试减去08。 shell将以0开头的任何数字视为八进制。由于08不是有效的八进制数,因此收到错误消息。

[[[

的比较

正如Jonathan Leffler所指出的,[[的隐含算术特征是旧[和新[[之间的另一个细微差别。观察:

$ [[ "6+3" -eq "9" ]] && echo True
True
$ [ "6+3" -eq "9" ] && echo True
bash: [: 6+3: integer expression expected

[[中不存在[的隐含算术功能。