我是 Bash 的新手,我尝试了一个有两个变量数字a
和的if 语句,但是没有成功b
。
我只想输出$check
大于$b
,1
所以我尝试了这个:
#!/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”
了解如何以及为何引用非常重要。