web-dev-qa-db-fra.com

Vérifier le nombre d'arguments transmis à un script Bash

J'aimerais que mon script Bash imprime un message d'erreur si le nombre d'arguments requis n'est pas atteint.

J'ai essayé le code suivant:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

Pour une raison inconnue, j'ai l'erreur suivante:

test: line 4: [2: command not found

Qu'est-ce que je fais mal?

564
Naftaly

Comme toute autre commande simple, [ ... ] ou test nécessite des espaces entre ses arguments.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

Ou

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Quand vous êtes dans Bash, préférez utiliser [[ ]] à la place, car le fractionnement de Word et le développement du chemin d'accès à ses variables ne sont pas nécessairement complétés par des guillemets, sauf si cela fait partie d'une expression.

[[ $# -ne 1 ]]

Il possède également d'autres fonctionnalités telles que le groupement de conditions non entre guillemets, la correspondance de modèle (correspondance de modèle étendue avec extglob) et la correspondance de regex.

L'exemple suivant vérifie si les arguments sont valides. Cela permet un seul argument ou deux.

[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

Pour les expressions arithmétiques pures, utiliser (( )) avec certaines peut être encore meilleur, mais elles sont toujours possibles dans [[ ]] avec ses opérateurs arithmétiques comme -eq, -ne, -lt, -le, -gt ou -ge en plaçant l'expression sous la forme d'un argument de chaîne unique:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

Cela devrait être utile si vous devez également le combiner avec d’autres fonctionnalités de [[ ]].

Références:

858
konsolebox

Ce pourrait être une bonne idée d'utiliser expressions arithmétiques si vous avez affaire à des nombres.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
56

Sur []:! =, =, == ... sont string les opérateurs de comparaison et -eq, -gt ... sont arithmétiques binaires.

J'utiliserais:

if [ "$#" != "1" ]; then

Ou:

if [ $# -eq 1 ]; then
33
jhvaras

Si vous voulez seulement perdre un argument particulier, Parameter Substitution is great

#!/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
27
Pat

Une simple doublure qui fonctionne peut être réalisée en utilisant:

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

Cela se résume à:

  1. tester la variable bash pour la taille des paramètres $ # pas égal à 1 (notre nombre de sous-commandes)
  2. si true, appelle la fonction usage () et quitte avec le statut 1
  3. sinon appel de la fonction main ()

Pense à noter:

  • usage () peut simplement être un simple echo "$ 0: params"
  • principal peut être un long script
12
Dwight Spencer

Découvrez this bash cheatsheet, cela peut aider beaucoup.

Pour vérifier la longueur des arguments transmis, utilisez "$#".

Pour utiliser le tableau d'arguments transmis, utilisez "$@".

Voici un exemple de vérification de la longueur et d’itération:

myFunc() {
  if [[ "$#" -gt 0 ]]; then
    for arg in "$@"; do
      echo $arg
    done
  fi
}

myFunc "$@"

Ce stage m'a aidé, mais il me manquait quelques petites choses pour moi et ma situation. Espérons que cela aide quelqu'un.

1
Nick Hall

Si vous voulez être prudent, je vous recommande d’utiliser getopts. 

Voici un petit exemple: 

    while getopts "x:c" opt; do
      case $opt in
        c)
          echo "-$opt was triggered, deploy to ci account" >&2
          DEPLOY_CI_ACCT="true"
          ;;
            x)
              echo "-$opt was triggered, Parameter: $OPTARG" >&2 
              CMD_TO_EXEC=${OPTARG}
              ;;
            \?)
              echo "Invalid option: -$OPTARG" >&2 
              Usage
              exit 1
              ;;
            :)
              echo "Option -$OPTARG requires an argument." >&2 
              Usage
              exit 1
              ;;
          esac
        done

voir plus de détails ici par exemple http://wiki.bash-hackers.org/howto/getopts_tutorial

0
IsaacE

Vous devez ajouter des espaces entre les conditions de test:

if [ $# -ne 1 ]; 
    then echo "illegal number of parameters"
fi

J'espère que ça aide.

0
Fabricio

Voici un simple liners pour vérifier si un seul paramètre est donné, sinon quittez le script:

[ "$#" -ne 1 ] && echo "USAGE $0 <PARAMETER>" && exit
0
panticz.de