BASH:基本 if then 和变量赋值设置 Cron Job

BASH:基本 if then 和变量赋值设置 Cron Job

我是 Bash 的新手,我尝试了一个有两个变量数字a和的if 语句,但是没有成功b

我只想输出$check大于$b1所以我尝试了这个:

#!/bin/bash

a=$(shuf -i 1-59 -n 1);

b=$(shuf -i 1-10 -n 1);

if [ $b -gt 1 ];
then
  check="*/$a * * * * /usr/bin/php /var/www/html/requests/check.php > /dev/null"
fi

{
  echo $check
} | crontab -u ubuntu -

它不起作用,为什么我会收到这个错误信息?"-":0: bad day-of-month

答案1

你的脚本有几个问题。

1. 未加引号的 $check 变量

在这一部分中,

{
  echo $check
} | crontab -u ubuntu -

echo $check将扩展为echo */$2 * * * * <other text here>,但 bash*将对每个 glob 星号执行文件名扩展,以扩展为脚本当前工作目录的内容。因此,实际上,您crontab收到的最终字符串完全不正确。

2. 潜在零变量

$check当且仅当$b大于 1 时,变量才会被设置。那么,当 为 1 时会发生什么?$b你的变量将不会被设置。

if [ $b -gt 1 ];
then
     check="*/$a * * * * /usr/bin/php /var/www/html/requests/check.php > /dev/null"
fi

这也意味着当你使用echo变量时,你的crontab命令将收到一个空字符串。因此,你可能需要在那里实现另一个 if 语句来检查$check变量是否为空,例如

if [ "x$check" != "x"  ];
then
    echo "$check" | crontab -u ubuntu -
fi

当然,出于对 shell 脚本的热爱,请引用您的字符串变量。


根据评论中的要求,可以以类似的方式将多个条目输出到 crontab:

$ check1="*/2 * * * * bash -c 'wall <<< \"check1\"'"                                                               

$ check2="*/2 * * * * bash -c 'wall <<< \"check1\"'"                                                               

$ printf "%s\n" "$check1" "$check2" | crontab -u $USER -

这里的想法是printf继续处理参数,直到所有参数都用完,因此它基本上与 for 循环相同。或者,可以将每个所需的 crontab 字符串附加到数组中,然后通过同一个数组使用 for 循环进行迭代。

答案2

确保您完全理解 BASH 中的命令替换。我删除了 crontab 的管道以进行测试和理解。您可以使用以下命令将其重新放到位:

回显“$check”|crontab -u ubuntu -

但请先看一下这里的例子:

/bin/bash #!/bin/bash

设置-x

a=$(shuf-i 1-59-n 1)
b=$(shuf-i 1-10-n 1)

如果[$b-gt 1]
然后
  检查 = '*/'${a}' * * * * /usr/bin/php /var/www/html/requests/check.php > /dev/null'

回显“$check”

您需要阅读手册才能了解 BASH 作为解释器的工作原理。这里要解释的内容太多了。还有一个提示:您可以使用

bash -n 脚本名称

通过以下示例自学并尝试理解它们,您就会理解上述问题:-)

回显 *
回显“*”
回显‘*’
X='*';回显$X
X='*';回显“$X”
X="*";回显“$X”

了解如何以及为何引用非常重要。

相关内容