¿Cómo verificar si no hay parámetros proporcionados a un comando?

75

¿Cómo se verifica si $*está vacío? En otras palabras, ¿cómo verificar si no se proporcionaron argumentos a un comando?

Bueno en realidad
fuente

Respuestas:

112

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 bashy lea el tema llamado Parámetros especiales

Sachin Divekar
fuente
55
O if ! (($#)); ..., o if (($# == 0)); ..., o if [ $# -eq 0 ]; ..., ! (($#)) && ...o(($#)) || ...
nicerobot
77
[ $# -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 $IFSestá vacío.
Gilles 'SO- deja de ser malvado'
1
La "$*"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.
manatwork
Creo que debería ser = en lugar de == ... actualmente recibo un error inesperado del operador, y cambiar a = soluciona el problema.
Bueno, en realidad el
@Charlotte Eso significa que no estás usando bash. Estás utilizando shpara ejecutar el script. AFAIK ==es válido solo en bash.
Sachin Divekar
14

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
Palmadita
fuente
-4

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
Joel Dsouza
fuente
55
Esa parece ser una forma complicada de hacer lo que la respuesta aceptada escribió hace 5 años ...
Jeff Schaller