Tengo un script de shell donde tenemos las siguientes líneas if [ -z "$xyz" ]
y if [ -n "$abc" ]
, pero no estoy seguro de cuál es su propósito. ¿Alguien puede explicarnos?
Respuesta
Puede encontrar una referencia muy buena para los operadores de bash aquí . Si estás usando un shell diferente, simplemente busca <my shell> operators
y encontrarás todo lo que necesitas. En tu caso particular, estás usando:
-n string is not null. -z string is null, that is, has zero length
Para ilustrar:
$ foo="bar"; $ [ -n "$foo" ] && echo "foo is not null" foo is not null $ [ -z "$foo" ] && echo "foo is null" $ foo=""; $ [ -n "$foo" ] && echo "foo is not null" $ [ -z "$foo" ] && echo "foo is null" foo is null
Comentarios
Responder
man test
o man [
le darán todas las opciones para probar el comando. En este caso, -n está probando para ver si el contenido de $ abc tiene una longitud distinta de cero y -z está probando para ver si el contenido de $ xyz es una cadena de longitud cero.
Comentarios
- man [doesn ' no me funciona en GNU bash, versión 4.1.2 (1) -release (x86_64- redhat-linux-gnu). Pero +1 para la prueba man.
- Nota
man test
(¿siempre?) Da la página man para la versión del programa externo, que (para la versión GNU-coreutils en menos) advierte explícitamente que algunos shells (IME la mayoría) tienen una versión incorporada que puede ser diferente.
Respuesta
Para extender la respuesta de terdon , encontré que Unix / Linux – Operadores básicos de Shell en Tutorials Point también incluye operadores relacionados con archivos (así como otros útiles).
-b file Checks if file is a block special file; if yes, then the condition becomes true. [ -b $file ] is false. -c file Checks if file is a character special file; if yes, then the condition becomes true. [ -c $file ] is false. -d file Checks if file is a directory; if yes, then the condition becomes true. [ -d $file ] is not true. -f file Checks if file is an ordinary file as opposed to a directory or special file; if yes, then the condition becomes true. [ -f $file ] is true. -g file Checks if file has its set group ID (SGID) bit set; if yes, then the condition becomes true. [ -g $file ] is false. -k file Checks if file has its sticky bit set; if yes, then the condition becomes true. [ -k $file ] is false. -p file Checks if file is a named pipe; if yes, then the condition becomes true. [ -p $file ] is false. -t file Checks if file descriptor is open and associated with a terminal; if yes, then the condition becomes true. [ -t $file ] is false. -u file Checks if file has its Set User ID (SUID) bit set; if yes, then the condition becomes true. [ -u $file ] is false. -r file Checks if file is readable; if yes, then the condition becomes true. [ -r $file ] is true. -w file Checks if file is writable; if yes, then the condition becomes true. [ -w $file ] is true. -x file Checks if file is executable; if yes, then the condition becomes true. [ -x $file ] is true. -s file Checks if file has size greater than 0; if yes, then condition becomes true. [ -s $file ] is true. -e file Checks if file exists; is true even if file is a directory but exists. [ -e $file ] is true.
-n
funcione, podría deberse a que está siguiendo algunas guías incorrectas en la web (por ejemplo, GeeksforGeeks o TutorialsPoint ) que no citan las variables. Esta respuesta, y la guía vinculada aquí, citan correctamente Si usa-n
sin citar, le dirá que ' no está vacío incluso cuando lo está. @terdon, ¡muchas gracias!