Condição de teste no comando if

Condição de teste no comando if

Alguma ideia de por que echoa instrução está sendo executada em ambos os cenários?

Saídas it worked:

#!/bin/bash

rizwan=''
if [ -n $rizwan ]; then
  echo "it worked"
fi

Substitua -npor -ze a saída será gerada it workedquando não houver saída:

#!/bin/bash

rizwan=''
if [ -z $rizwan ]; then
  echo "it worked"
fi

Responder1

Você pode saber ou não, mas vamos deixar claro: [não faz parte da ifsintaxe. Quero dizer, se if [ …comporta como if true, if falseou if any_command, onde [, e são comandos. Eles retornam o status de saída e é isso que importa .truefalseany_commandif

Mesmo que [seja um comando interno (e esteja no Bash), ele se comporta como um comando normal. Existe até um [executável independente (por exemplo /usr/bin/[, ) porque é exigido pelo POSIX.

Isso significa [ -n whatever ]que é apenas um [comando com poucos argumentos. Sim, ]é apenas um argumento, não é um delimitador ou algo parecido. O comando nomeado [requer apenas ]ser seu último argumento. Dessa forma o código fica mais legível, ]não tem outra finalidade.

O comando testé equivalente a [. A única diferença é que testnão exige ].
[ -n whatever ]é equivalente a test -n whatever.

Se o shell se expandir $rizwanpara uma string vazia, os trechos [ -n $rizwan ]e [ -z $rizwan ]se tornarão [ -n ]e [ -z ]respectivamente. O [comando não sabe que havia algo entre -n(ou -z) e ]no seu código, ele obtém exatamente dois argumentos. Ambos os testes são tratados como a [ STRING ]sintaxe onde STRINGestá -nou -z. Esta sintaxe testa se STRINGnão está vazia. Seus testes sempre são bem-sucedidos porque nem -numa -zstring vazia.

Para fazer os trechos funcionarem como [ -n STRING ]ou [ -z STRING ], você precisa colocar aspas duplas na variável. O shell, após expandir [ -z "$rizwan" ], passará exatamentetrêsargumentos para [. Eles serão -z, o valor expandido da variável (mesmo que seja uma string vazia) e ]. A ferramenta obterá todos os argumentos que você deseja.

Se não for citado $rizwanem seus exemplos expandido para mais de uma palavra, [obteria mais de três argumentos. Em geral o resultado final dependeria do conteúdo da variável e da implementação do [.

CompararPor que meu script de shell engasga com espaços em branco ou outros caracteres especiais?.

Nota [[no Bash é diferente. É uma palavra-chave, está integrada ao analisador de shell, altera algumas regras, na verdade reconhece variáveis ​​​​e aspas entre [[e ]]. Se você usasse [[em vez de [(e consequentemente ]]em vez de ]), seu código funcionaria conforme o esperado. Veresta resposta.

[é o portátil.

Responder2

Como a variável rizwanestá vazia, seu ifcomando se torna:

if [ -n  ]

A sintaxe [ STRING ]testa se a string está vazia (sem caracteres). Portanto, no seu caso [ -n ], a string -nevidentemente não está vazia.

informação relacionada