Я - новичок в Bash, я попробовал без успеха, если оператор, где у меня есть два переменных числа a
и 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
Существуют проблемы пары с Вашим сценарием.
В этой части,
{
echo $check
} | crontab -u ubuntu -
echo $check
расширится до echo */$2 * * * * <other text here>
, но удар *
выполнит расширение имени файла на содержание текущего рабочего каталога сценария на каждом из звездообразных символов шарика. Таким образом, эффективно, Ваш crontab
получает абсолютно неправильную заключительную строку.
Ваш $check
переменный набор, если и только если $b
больше, чем 1. Ну, что происходит когда $b
1? Ваша переменная не будет установлена.
if [ $b -gt 1 ];
then
check="*/$a * * * * /usr/bin/php /var/www/html/requests/check.php > /dev/null"
fi
Это также означает когда Вы echo
переменная, Ваш crontab
команда получит пустую строку. Таким образом Вы могли бы хотеть реализовать другого если оператор там, чтобы проверить ли $check
переменная является пустой, как
if [ "x$check" != "x" ];
then
echo "$check" | crontab -u ubuntu -
fi
И конечно, из любви к сценариям оболочки, заключают Ваши строковые переменные в кавычки.
Согласно просьбе в комментариях, многократные въезды могли быть произведены к crontab подобным способом:
$ check1="*/2 * * * * bash -c 'wall <<< \"check1\"'"
$ check2="*/2 * * * * bash -c 'wall <<< \"check1\"'"
$ printf "%s\n" "$check1" "$check2" | crontab -u $USER -
Идея здесь - это printf
продолжает обрабатывать аргументы, пока все не исчерпываются так, это - в основном то же как для цикла. С другой стороны, можно было добавить, каждый требовал строки crontab в массив, и выполните итерации использования для цикла через тот же самый массив.
Удостоверьтесь, что Вы полный понимаете замену команды в Bash. Я удалил канал к crontab для тестирования и понимания. можно поместить его на месте снова с:
echo "$check"|crontab -u ubuntu -
, но взгляните к этому примеру здесь сначала:
#!/bin/bash set -x 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"
необходимо прочитать руководства, чтобы понять, как Bash работает интерпретатором. Существует слишком много для объяснения здесь. Еще одна подсказка: можно сделать, проверка синтаксиса с
bash -n script-name
Самостоятельно учится со следующими примерами и пытается понять их, и Вы поймете свою проблему выше :-)
echo * echo "*" echo '*' X='*';echo $X X='*';echo "$X" X="*";echo "$X"
Это важно для понимания, как и почему заключить в кавычки.