[
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" ]