Colchetes na condição if: por que estou recebendo erros de sintaxe sem espaço em branco?

12

Estou usando o script abaixo para voltar dois dias quando o script é executado em dois dias do ano e também verificar primeiro e segundo dia de cada mês e mudar dois dias atrás.

if [$month="01"] && [$day="01"];
then
    date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
         date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
   if [ $day = "01" ];
then
    date="$last_month/$yes_day/$year"
            fulldate="$year$last_month$yes_day"
else
        if [ $day = "02" ];
then
    date="$last_month/$yes_day/$year"
        fulldate="$year$last_month$yes_day"
else
    date="$month/$yes_day/$year"
        fulldate="$year$month$yes_day"
                fi
               fi
              fi
fi

Mas meu problema é receber a mensagem de erro abaixo

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
    
por Kumar1 04.06.2014 / 15:57

3 respostas

23

[ não é nem um metacaractere nem um operador de controle (nem mesmo uma palavra reservada; o mesmo para ] ), portanto, precisa de espaço em branco em torno dele. Caso contrário, o shell "verá" o comando [01=01] em vez do comando [ com os parâmetros separados 01 , = , 01 e ] . Cada operador e operando precisa ser um argumento separado para o comando [ , portanto, os espaços em branco também são necessários em torno dos operadores.

if [ "$month" = "01" ]

[$month="01"] é um padrão curinga que corresponde a qualquer um dos caracteres em $month ou "01 . Se não corresponder a nada, é deixado em paz.

Se houver um ponto-e-vírgula após o colchete de fechamento, você não precisará de um espaço antes dele, porque o ponto-e-vírgula é sempre parte de um token separado.

if [ "$month" = "01" ]; then

O mesmo vale para a sintaxe de colchetes duplos do bash (e do ksh e do zsh).

Mais de uma condição

Existem duas maneiras de combinar condições:

  1. dentro de [

  2. com comandos [ separados combinados com && ou ||

Agrupar com colchetes é provavelmente mais fácil em [ .

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

O primeiro deve ser evitado, pois não é confiável (tente por exemplo com month='!' ). Problemas com conteúdo variável estranho podem ser evitados usando a string segura (se houver) primeiro; ou usando [[ / ]] em vez de [ / ] :

if [ "01" = "$month" -a "01" = "$day" ]
    
por 04.06.2014 / 16:11
4

Outra maneira de escrevê-lo:

case $month:$day in
  (01:0[12])
    date="$last_month/$yes_day/$last_year"
    fulldate="$last_month/$yes_day/$last_year"
    ;;
  (*:0[12])
    date="$last_month/$yes_day/$year"
    fulldate="$year$last_month$yes_day"
    ;;
  (*)
    date="$month/$yes_day/$year"
    fulldate="$year$month$yes_day"
esac
    
por 04.06.2014 / 17:02
-1

Então, esta é sua resposta:

if [ $var1 == $var2 ];
 then
    echo "bla bla"
fi

Portanto, você deve colocar "espaço" entre o colchete e a variável / valor.

    
por 04.06.2014 / 16:05