希望添加一个 crontab 条目,以便从首次执行之日起每三天运行一次作业。
我正在进行算术评估。
echo $((($(date +%s) - $(date -d "2024-12-22" +%s)) / 86400 % 3 == 0))
更新命令以尝试执行脚本返回“bash:第 1 行:0:未找到命令”
bash -c '$((($(date +%s) - $(date -d "2024-12-22" +%s)) / 86400 % 2 == 0)) && /scripts/backup/db_bak.sh'
我认为这是语法不正确的情况,很可能与括号或缺少括号有关? 我将上面的行插入 shellcheck.net,它返回“未检测到问题!”所以也许比简单的语法更微妙一些。
您正在尝试使用算术上下文作为条件。您不能为此使用算术展开式
$((...))
;对扩展进行评估,然后 Bash 尝试将结果作为命令运行。例如:
$ echo $((1 + 1 > 2))
0
因为
1 + 1 > 2
不是真的。
如果你直接使用它作为条件,就像
$((1 + 1 > 2)) && echo "The condition is true"
扩展为
0 && echo "The condition is true"
然后 Bash 抱怨
0
不是命令。 (它会抱怨 1
不是真实条件的命令。)
((...))
条件构造。如果表达式的值非零,则认为为真,这就是我们想要的:
((1 + 1 > 2)) && echo "The condition is true"
不会打印任何东西,并且
((1 + 1 == 2)) && echo "The condition is true"
打印
The condition is true
。
tl;dr:您必须从命令中删除前导
$
。
bash -c '((($(date +%s) - $(date -d "2024-12-22" +%s)) / 86400 % 2 == 0)) && /scripts/backup/db_bak.sh'
请注意,如果您将这个确切的命令作为 cronjob 运行,您还必须转义
%
,否则它们可能会被视为换行符(请参阅 crontab 手册):
bash -c '((($(date +\%s) - $(date -d "2024-12-22" +\%s)) / 86400 \% 2 == 0)) && /scripts/backup/db_bak.sh'