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


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


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

-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

55
Esa parece ser una forma complicada de hacer lo que la respuesta aceptada escribió hace 5 años ...
Jeff Schaller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.