Bash值对于Base太大,无法在if语句中使用日期

Bash值对于Base太大,无法在if语句中使用日期,bash,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

我见过类似的情况,但无法真正理解如何正确地将建议的解决方案应用于我的情况

我有一个包含以下行的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")
因为我实际上是在搜索物理目录名,所以我不能删除零。我将如何进行此工作?

替换:

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

因为日期不是有效的数字,所以要进行字符串比较(
=
),而不是数字比较(
-eq

讨论 注意:

$ [[ "10-1" -eq "9" ]] && echo True
True
$ [[ "6+3" -eq "9" ]] && echo True
True
$ [[ "6+3" -eq "9" ]] && echo True
True
$ [ "6+3" -eq "9" ] && echo True
bash: [: 6+3: integer expression expected
在数字上下文中,信号为
-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

[[
的隐含算术功能在
[

完美!谢谢!像这样的小事让我保持谦卑,这一切都构成了另一个不信任
的理由[[
运算符,或者从它的有用性中减去,因为它所做的事情是您不希望也可能不想要的。@JonathanLeffler这是非常正确的。我最初假设并期望==是数字运算符,-eq用于字符串。@JonathanLeffler我回避
[[
有两个方面。第一个是POSIX不兼容。第二个是,为了便于学习和使用,语言应该是一致的。通过在
[[
中有一组单独的引用规则,即使那些引用规则“更好”,也会增加不一致性和惊讶。你有其他不信任
的原因吗[[
?这是两个主要原因,尤其是不一致性。我不信任的另一个方面是,
=
运算符的RHS有时是一个shell全局模式。(当使用“==”和“!=”运算符时,运算符右侧的字符串被视为一个模式…)我也不喜欢算术
(…)
操作中没有
$
前缀的标识符的特殊大小写;我更希望保持一致性而不是特殊情况。