Alguma ideia de por que echo
a 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 -n
por -z
e a saída será gerada it worked
quando 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 if
sintaxe. Quero dizer, se if [ …
comporta como if true
, if false
ou if any_command
, onde [
, e são comandos. Eles retornam o status de saída e é isso que importa .true
false
any_command
if
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 test
não exige ]
.
[ -n whatever ]
é equivalente a test -n whatever
.
Se o shell se expandir $rizwan
para 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 STRING
está -n
ou -z
. Esta sintaxe testa se STRING
não está vazia. Seus testes sempre são bem-sucedidos porque nem -n
uma -z
string 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 $rizwan
em 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 rizwan
está vazia, seu if
comando se torna:
if [ -n ]
A sintaxe [ STRING ]
testa se a string está vazia (sem caracteres). Portanto, no seu caso [ -n ]
, a string -n
evidentemente não está vazia.