Mi pregunta es sobre los valores de retorno producidos por este código:
if [ -n ]; then echo "true"; else echo "false"; fi
Esto imprime true
.
Su prueba complementaria usando [ -z ]
también imprime true
:
if [ -z ]; then echo "true"; else echo "false"; fi
En el código anterior, ¿por qué la [ -n ]
prueba supone el valor de cadena que no se pasa en absoluto, ya que no es nulo?
Se imprime el siguiente código false
. Esto se espera ya que el valor de cadena pasado es nulo y de longitud cero.
if [ -n "" ]; then echo "true"; else echo "false"; fi
[ -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.-o
aquí. En algunos shells comobash
,-o
es un operador unario (prueba si se establece una opción) y binario (o), por lo que cosas como[ ! -o monitor ]
son ambiguas. ¿Está probando que lamonitor
opción no está configurada, o que!
o bienmonitor
son cadenas no vacías? Las reglas POSIX deciden: la última (eso es diferente con[[ ! -o monitor ]]
).[ -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-
yn
, no caracteres cero, se[ -n ]
evalúa como verdadera.Como dice Ignacio Vázquez-Abrams , donde
string
hay un solo argumento, la prueba realizadastring
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
[
debash
mediante el examen de la ayuda para ello. Tenga en cuenta que es un shell incorporado :Por lo tanto, puede ejecutar
help [
para obtener ayuda:Para obtener más información, incluyendo qué pruebas son compatibles y cómo funcionan, tendrá que ver la ayuda
test
. Cuando ejecute el comandohelp test
, obtendrá una lista detallada. En lugar de reproducirlo todo, esta es la parte sobre los operadores de cadenas:Observe eso
-n STRING
y simplementeSTRING
haga lo mismo: prueban si la cadenaSTRING
no está vacía.fuente
IFS
espacios en blanco, harán eso; Las variables que contienen varias palabras en lugar de cero producen otro efecto y pueden hacer que se ejecute una prueba completamente diferente. Las cadenas que aparecen literalmente con la intención de ser operandos solo funcionarán correctamente si no contienen espacios o pestañas o si están entre comillas. La respuesta sería mucho más larga y complicada si cubriera este tema de manera accesible. Si decides publicar una respuesta, ¡no dudes en enviarme un mensaje aquí al respecto![ "$var" ]
nunca sería utilizable como prueba porque$var
podría expandirse a-n
.[ -n ]
es cierto porque el[
comando (también conocido como eltest
comando) actúa sobre el número de argumentos que se le da. Si se le da un solo argumento, el resultado es "verdadero" si el argumento es una cadena no vacía. "-n" es una cadena con 2 caracteres, no está vacía, por lo tanto, "verdadero".fuente