BASH: Básico se então e atribuição de variável definir um trabalho Cron

0

Sou novato no Bash, tentei sem sucesso uma instrução if em que tenho dois números de variáveis a e b .

Eu quero produzir $check somente se $b for maior que 1 , então tentei fazer isso:

#!/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 -

Não funciona, porque recebo esta mensagem de erro? "-":0: bad day-of-month

    
por NineCattoRules 08.02.2017 / 20:13

2 respostas

2

Há alguns problemas com o seu script.

1. Variável de verificação $ não cotada

Nesta parte,

{
  echo $check
} | crontab -u ubuntu -

echo $check expandirá para echo */$2 * * * * <other text here> , mas bash * executará a expansão de nome de arquivo no conteúdo do diretório de trabalho atual do script em cada um dos símbolos glob star. Assim, efetivamente, seu crontab recebe uma string final completamente incorreta.

2. Variável nula potencial

Sua variável $check é definida se e somente se $b for maior que 1. Bem, o que acontece quando $b é 1? sua variável não será definida.

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

Isso também significa que quando você echo da variável, o comando crontab receberá uma string nula. Assim, você pode querer implementar outra instrução if para verificar se $check variable é nulo, como

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

E, claro, por favor, por favor, por amor ao script de shell, cite suas variáveis de string.

Conforme solicitado nos comentários, várias entradas podem ser enviadas para o crontab de maneira semelhante:

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

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

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

A idéia aqui é que printf mantém os argumentos de processamento até que todos estejam esgotados, então é basicamente o mesmo que um loop for. Alternativamente, pode-se anexar cada string de crontab desejada em array e iterar usando loop por meio desse mesmo array.

    
por Sergiy Kolodyazhnyy 08.02.2017 / 20:39
2

Certifique-se de entender completamente a substituição de comando no BASH. Eu removi o tubo para crontab para teste e compreensão. você pode colocá-lo no lugar novamente com:

echo "$check"|crontab -u ubuntu -

mas, por favor, veja primeiro este exemplo aqui:

#!/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"

Você precisa ler manuais para entender como o BASH funciona como um intérprete. Há muito a explicar aqui. Mais uma dica: você pode fazer a verificação de sintaxe com

bash -n script-name

Ensine-se com os exemplos a seguir e tente entendê-los e você entenderá seu problema acima: -)

echo *
echo "*"
echo '*'
X='*';echo $X
X='*';echo "$X"
X="*";echo "$X"

É importante entender como e por que citar.

    
por 0x0C4 08.02.2017 / 21:03