[ -n ]
No utiliza la -n
prueba.
El -n
en [ -n ]
no es una prueba en absoluto. Cuando solo hay un argumento entre [
y ]
, ese argumento es una cadena que se prueba para ver si está vacía. Incluso cuando esa cadena tiene un encabezado -
, todavía se interpreta como un operando, no una prueba. Dado que la cadena -n
no está vacía, contiene dos caracteres -
y n
, no caracteres cero, se [ -n ]
evalúa como verdadera.
Como dice Ignacio Vázquez-Abrams , donde string
hay un solo argumento, la prueba realizada string
en es la misma que la realizada en . Cuando sucede ser , no pasa nada especial. El in y el segundo in son simplemente cadenas que se prueban para el vacío.[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
Cuando solo hay un argumento entre [
y ]
, ese argumento siempre es una cadena que se probará para detectar la ausencia de vacíos, incluso si se denomina igual que una prueba. De manera similar, cuando hay dos argumentos entre [
y, ]
y el primero de ellos es -n
, el segundo siempre es una cadena que se probará para detectar la ausencia de vacíos, incluso si resulta que se denomina igual que una prueba. Esto es simplemente porque la sintaxis de [
insiste en que un solo argumento entre [
y ]
después -n
es un operando de cadena.
Por la misma razón que [ -n ]
no usa la -n
prueba, [ -z ]
no usa la -z
prueba.
Usted puede aprender más acerca [
de bash
mediante el examen de la ayuda para ello. Tenga en cuenta que es un shell incorporado :
$ type [
[ is a shell builtin
Por lo tanto, puede ejecutar help [
para obtener ayuda:
$ 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 obtener más información, incluyendo qué pruebas son compatibles y cómo funcionan, tendrá que ver la ayuda test
. Cuando ejecute el comando help test
, obtendrá una lista detallada. En lugar de reproducirlo todo, esta es la parte sobre los operadores de cadenas:
-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 eso -n STRING
y simplemente STRING
haga lo mismo: prueban si la cadena STRING
no está vacía.
[ -t ]
estaba probando si stdout era un terminal (abreviatura[ -t 1 ]
) y algunos shells todavía lo están haciendo (en el caso de queksh93
solo-t
sea literal), por lo que es mejor usarlo[ -n "$var" ]
que[ "$var" ]
. A pesar de eso todavía fallar en algunos viejostest
implementaciones para los valores de$var
como=
, en cuyo caso,[ "" != "$var" ]
o[ "x$var" != x ]
, ocase $x in "")...
pueden ser mejores.