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 1declaració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 unaifdeclaració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
diefunción (a laperl) como:Puede agregar más campanas y silbatos como colores, prefijo, número de línea ... si es necesario.
fuente
diefunción con múltiples argumentos? (Si es así, ¿puede dar un ejemplo?) Uso unadiefunció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$IFSSPC para que funcione en todos los contextos, incluidos aquellos en los que$IFSse ha modificado. Alternativamente conksh/zsh, puede usarprint -r -- "$@"oecho -E - "$@"enzsh.diefunció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 dediefunción paraprintfgenerar un mensaje de error de varias líneas al pasar varios argumentos? ¿O solo pasa un argumento paradieque 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 contartestcombinar múltiples operaciones en una sola invocación se evitan; vea los marcadores OB en pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/shy el predecesor inmediato de Heirloom Bourne) tampoco lo tenía.