我见过类似的情况,但无法真正弄清楚如何正确地将建议的解决方案应用到我的情况中。
我有一个包含以下行的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")
因为我实际上在搜索物理目录名称,所以我不能删除零。我将如何开展这项工作?
答案 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
[[
中不存在[
的隐含算术功能。