A inconsistência é em grande parte devido a razões históricas.
O uso de parênteses como o comando condicional veio após o uso de parênteses em padrões curinga. Então, no momento em que [ -n foo ]
entrou em cena, [foo]
já significava "um arquivo cujo nome é f
ou o
". Enquanto poucos usos do operador de braquetes na prática teriam conflitado com usos realistas dos braquetes em curingas, os autores escolheram não arriscar quebrar scripts existentes alterando a sintaxe. Essa escolha de design também facilitou a implementação: inicialmente [
foi implementado como um comando externo, o que não poderia ter sido feito se o espaço após [
tivesse sido opcional. (Os sistemas modernos ainda têm [
como um comando externo, mas quase todos os shells modernos também o fazem.)
Por motivos semelhantes, o seu código de "trabalho" está incorreto na maioria das circunstâncias. $1
não significa “o valor do parâmetro 1”: significa “pegar o valor do parâmetro 1, dividi-lo em palavras separadas no espaço em branco (ou qualquer que seja o valor de IFS
) e interpretar cada palavra como glob padronizar". A maneira de escrever “o valor do parâmetro 1” requer aspas duplas: "$1"
. Consulte Quando é necessário fazer uma cotação dupla? para o assunto gritty. Você não precisa entender isso; tudo que você precisa lembrar é: sempre coloca aspas duplas em torno das substituições de variável "$foo"
e substituições de comando "$(foo)"
. Assim:
if [ -n "$1" ]; then …
No bash, ksh e zsh, mas não no sh simples, você também pode usar colchetes duplos. Parênteses únicos [ … ]
são analisados como um comando comum (e, de fato, [
é um comando comum, embora geralmente embutido). Os colchetes duplos são uma construção sintática separada e você pode omitir as aspas duplas na maioria das vezes.
if [[ -n $1 ]]; then …
No entanto, há uma exceção: [[ "$foo" = "$bar" ]]
para testar se as duas variáveis têm o mesmo valor requer aspas duplas em torno de $bar
, caso contrário, $bar
é interpretado como um padrão de caractere curinga. Novamente, em vez de lembrar os detalhes, você deve usar aspas duplas o tempo todo.