¿Cómo se verifica si $*
está vacío? En otras palabras, ¿cómo verificar si no se proporcionaron argumentos a un comando?
¿Cómo se verifica si $*
está vacío? En otras palabras, ¿cómo verificar si no se proporcionaron argumentos a un comando?
Respuestas:
Para verificar si no se proporcionaron argumentos para el comando, verifique el valor de la $#
variable, luego,
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
Si desea usar $*
( no preferible ) entonces,
if [ "$*" == "" ]; then
echo "No arguments provided"
exit 1
fi
Alguna explicación:
El segundo enfoque no es preferible porque en la expansión de parámetros posicionales se *
expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión se produce entre comillas dobles, se expande a una sola palabra con el valor de cada parámetro separado por el primer carácter de la variable especial IFS. Eso significa que se construye una cadena. Por lo tanto, hay gastos generales adicionales.
Por otro lado se #
expande al número de parámetros posicionales.
Ejemplo:
$ command param1 param2
Aquí,
El valor de $#
es 2 y el valor de $*
es la cadena "param1 param2" (sin comillas), si IFS no está configurado. Porque si IFS no está configurado, los parámetros están separados por espacios
Para más detalles man bash
y lea el tema llamado Parámetros especiales
[ $# -eq 0 ]
Es la forma más común de IME. Hay casos extremos donde "$#"
puede estar vacío: si hay un único argumento que está vacío, o si hay varios argumentos vacíos y $IFS
está vacío.
"$*"
expresión también evaluará ""
si solo ""
se pasó un parámetro. Pero la mayoría de las veces probablemente no te importará de todos modos.
bash
. Estás utilizando sh
para ejecutar el script. AFAIK ==
es válido solo en bash
.
Si solo está interesado en rescatar si falta un argumento en particular, la sustitución de parámetros es excelente:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
esta es una de las formas en que puede saber que no tiene argumentos
NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
{do something}
fi
if ! (($#)); ...
, oif (($# == 0)); ...
, oif [ $# -eq 0 ]; ...
,! (($#)) && ...
o(($#)) || ...