Bash: Основной, если затем и переменное присвоение устанавливает Задание Крона

Я - новичок в 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

0
задан 8 February 2017 в 12:18

2 ответа

Существуют проблемы пары с Вашим сценарием.

1. Неупомянутая переменная $check

В этой части,

{
  echo $check
} | crontab -u ubuntu -

echo $check расширится до echo */$2 * * * * <other text here> , но удар * выполнит расширение имени файла на содержание текущего рабочего каталога сценария на каждом из звездообразных символов шарика. Таким образом, эффективно, Ваш crontab получает абсолютно неправильную заключительную строку.

2. Потенциальная пустая переменная

Ваш $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 в массив, и выполните итерации использования для цикла через тот же самый массив.

2
ответ дан 7 November 2019 в 00:34

Удостоверьтесь, что Вы полный понимаете замену команды в 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"

Это важно для понимания, как и почему заключить в кавычки.

2
ответ дан 7 November 2019 в 00:34

Другие вопросы по тегам:

Похожие вопросы: