Esto funciona en un indicador de shell (bash, dash):
[ -z "" ] && echo A || echo B
A
Sin embargo, estoy tratando de escribir un script de shell POSIX , comienza así:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
Y no sé por qué, pero no recibo el mensaje :
El argumento dado está vacío.
si llamo al script así:
./test_empty_argument ""
¿Porqué es eso?
shell-script
arguments
LinuxSecurityFreak
fuente
fuente
if [ X”” = X”$var” ] ; then echo isempty ; fi
[ "" = "$var" ]
funcionaría bien; una cadena vacía entrecomillada no se eliminará de la lista de argumentos de[
. Pero eso tampoco es necesario, porque[ -z "$var" ]
también funciona bien.Respuestas:
Tenga en cuenta que su línea
esto es lo mismo que
(un no citado
;
puede, en la mayoría de los casos, ser reemplazado por un carácter de nueva línea)Esto significa que la
exit 1
declaración siempre se ejecuta independientemente de cuántos argumentos se pasaron al script. Esto a su vez significa que el mensajeThe given argument is empty.
nunca tendrá la posibilidad de imprimirse.Para ejecutar más de una declaración después de una prueba usando la "sintaxis de cortocircuito", agrupe las declaraciones en
{ ...; }
. La alternativa es usar unaif
declaración adecuada (que, en mi humilde opinión, se ve más limpia en un script):Tiene el mismo problema con su segunda prueba.
Respecto a
Esto funcionaría para el ejemplo dado, pero el genérico
sería no ser el mismo que
En cambio, es más como
o
Es decir, si falla la prueba o el primer comando, se ejecuta el segundo comando, lo que significa que tiene el potencial de ejecutar las tres declaraciones involucradas.
fuente
Esta:
no es:
Pero en cambio es:
Su script se está cerrando independientemente de cuántos argumentos le haya pasado.
fuente
Una forma de hacerlo más legible es definir una
die
función (a laperl
) como:Puede agregar más campanas y silbatos como colores, prefijo, número de línea ... si es necesario.
fuente
die
función con múltiples argumentos? (Si es así, ¿puede dar un ejemplo?) Uso unadie
función casi idéntica , pero uso"$*"
en su lugar, ¿qué puede ser más de lo que pretende?"$@"
es que permite mensajes de varias líneas sin necesidad de agregar nuevas líneas literales."$*"
para unir args con espacios también significa que debe configurar$IFS
SPC para que funcione en todos los contextos, incluidos aquellos en los que$IFS
se ha modificado. Alternativamente conksh
/zsh
, puede usarprint -r -- "$@"
oecho -E - "$@"
enzsh
.die
función de tipo. Lo que pregunto es: en la práctica, ¿alguna vez has visto a alguien escribirdie "unable to blah:" "some error"
, con el fin de obtener un mensaje de error de 2 líneas?die() { IFS=" "; printf >&2 "%s\n" "$*"; exit 1; }
. ¿Alguna vez ha utilizado este tipo dedie
función paraprintf
generar un mensaje de error de varias líneas al pasar varios argumentos? ¿O solo pasa un argumento paradie
que solo agregue una nueva línea a su salida?A menudo he visto esto como una prueba para una cadena vacía:
fuente
-a
,-o
,(
y)
como derectives para contartest
combinar múltiples operaciones en una sola invocación se evitan; vea los marcadores OB en pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/sh
y el predecesor inmediato de Heirloom Bourne) tampoco lo tenía.