[ não é nem um metacaractere nem um operador de controle (nem mesmo uma palavra reservada; o mesmo para ] ), portanto, precisa de espaços 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:
-
dentro de
[ -
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" ]