在 Linux 命令行表达式上查找输入来评估日期,如果满足条件则执行脚本

问题描述 投票:0回答:1

希望添加一个 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,它返回“未检测到问题!”所以也许比简单的语法更微妙一些。

linux bash shell cron sh
1个回答
0
投票

您正在尝试使用算术上下文作为条件。您不能为此使用算术展开式

$((...))
;对扩展进行评估,然后 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'
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.