Bash值对于Base太大,无法在if语句中使用日期
我见过类似的情况,但无法真正理解如何正确地将建议的解决方案应用于我的情况 我有一个包含以下行的bash脚本: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
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全局模式。(当使用“==”和“!=”运算符时,运算符右侧的字符串被视为一个模式…)我也不喜欢算术(…)
操作中没有$
前缀的标识符的特殊大小写;我更希望保持一致性而不是特殊情况。