Comment vérifier si aucun paramètre n'est fourni à une commande?

75

Comment vérifiez-vous si $*est vide? En d'autres termes, comment vérifier si aucun argument n'a été fourni à une commande?

bien en fait
la source

Réponses:

112

Pour vérifier si aucun argument n'a été fourni à la commande, vérifiez la valeur de $#variable alors,

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

Si vous voulez utiliser $*( pas préférable ) alors,

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

Quelques explications:

La seconde approche n’est pas préférable car, dans les paramètres de position, l’extension se *développe en partant des paramètres de position. Lorsque le développement se produit entre guillemets doubles, il se développe en un seul mot avec la valeur de chaque paramètre séparée par le premier caractère de la variable spéciale IFS. Cela signifie qu'une chaîne est construite. Donc, il y a des frais généraux supplémentaires.

D'autre part se #développe au nombre de paramètres de position.

Exemple:

$ command param1 param2

Ici,

La valeur de $#est 2 et la $*chaîne de caractères "param1 param2" (sans les guillemets), si IFS n'est pas défini. Parce que si IFS n'est pas défini, les paramètres sont séparés par des espaces

Pour plus de détails man bashet lire la rubrique intitulée Paramètres spéciaux

Sachin Divekar
la source
5
Ou if ! (($#)); ..., ou if (($# == 0)); ..., ou if [ $# -eq 0 ]; ..., ou ! (($#)) && ..., ou(($#)) || ...
nicerobot
7
[ $# -eq 0 ]est la forme la plus courante de l'IME. Il existe des cas limites où il "$#"peut être vide: s'il existe un seul argument vide ou s'il y a plusieurs arguments vides et s'il $IFSest vide.
Gilles 'SO- arrête d'être méchant'
1
L' "$*"expression sera également évaluée ""si un seul ""paramètre a été passé. Mais la plupart du temps, vous ne vous en soucierez probablement pas.
Manatwork
Je crois que cela devrait être = au lieu de == ... actuellement, je reçois une erreur d'opérateur inattendue, et passer à = corrige le problème.
Et bien effectivement
@Charlotte Cela signifie que vous n'utilisez pas bash. Vous utilisez shpour exécuter le script. Autant que je sache ==est valable uniquement en bash.
Sachin Divekar
14

Si vous ne voulez perdre que si un argument particulier est manquant, la substitution de paramètre est excellente:

#!/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
Tapoter
la source
-4

c'est l'une des façons dont vous pouvez savoir que vous n'avez aucun argument

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi
Joel Dsouza
la source
5
Cela semble être une façon compliquée de faire ce que la réponse acceptée écrivait il y a 5 ans ....
Jeff Schaller