[ x ] é equivalente a [ -n x ] mesmo se x começar com - fornecido não há operandos.
$ [ -o ] ; echo $?
0
$ [ -eq ] ; echo $?
0
$ [ -n -o ] ; echo $?
0
$ [ -n -eq ] ; echo $?
0
A minha pergunta é sobre os valores de retorno produzidos por este código:
if [ -n ]; then echo "true"; else echo "false"; fi
Isto imprime true .
Seu teste complementar usando [ -z ] também imprime true :
if [ -z ]; then echo "true"; else echo "false"; fi
No código acima, por que o teste [ -n ] assume o valor da string que não é passado, pois não é nulo?
O código abaixo imprime false . Isso é esperado, pois o valor passado da string é nulo e tem comprimento zero.
if [ -n "" ]; then echo "true"; else echo "false"; fi
[ -n ] não usa o teste -n . O -n em [ -n ] não é um teste. Quando há apenas um argumento entre [ e ] , esse argumento é uma sequência testada para ver se está vazia. Mesmo quando essa cadeia tiver um - inicial, ela ainda será interpretada como um operando, não como um teste. Como a string -n não está vazia, ela contém dois caracteres, - e n , não zero caracteres - [ -n ] é avaliado como verdadeiro.
Como Ignacio Vazquez-Abrams diz , onde string é um único argumento, o teste realizado em string em [ string ] é o mesmo que o teste realizado por [ -n string ] . Quando string é -n , nada de especial acontece. O -n em [ -n ] e o segundo -n em [ -n -n ] são simplesmente strings sendo testadas quanto ao vazio.
Quando há apenas um argumento entre [ e ] , esse argumento é sempre uma string a ser testada quanto à não necessidade, mesmo que seja o mesmo que um teste. Da mesma forma, quando há dois argumentos entre [ e ] e o primeiro deles é -n , o segundo é sempre uma sequência a ser testada quanto ao não-imprevisibilidade, mesmo que tenha o mesmo nome que um teste . Isso ocorre simplesmente porque a sintaxe para [ insiste em que um único argumento entre [ e ] ou depois de -n é um operando de cadeia de caracteres.
Pelo mesmo motivo que [ -n ] não usa o teste -n , [ -z ] não usa o teste -z .
Você pode aprender mais sobre [ in bash examinando a ajuda para isso. Observe que é um shell embutido :
$ type [
[ is a shell builtin
Assim, você pode executar help [ para obter ajuda:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal ']', to match the opening '['.
Para mais informações, incluindo quais testes são suportados e como eles funcionam, você terá que ver a ajuda em test . Quando você executar o comando help test , obterá uma lista detalhada. Em vez de reproduzir tudo, aqui está a parte sobre operadores de string:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
Observe que -n STRING e apenas STRING fazem a mesma coisa: eles testam se a string STRING não está vazia.
[ -n ] é verdadeiro porque o comando [ (também conhecido como o comando test ) age sobre o número de argumentos que ele recebe. Se for dado apenas um único argumento, o resultado será "verdadeiro" se o argumento for uma string não vazia. "-n" é uma string com 2 caracteres, não vazia, portanto, "true".
Tags bash