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


Je voudrais 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?


498
2017-09-02 08:28


origine


Réponses:


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 à Bash, préférez utiliser [[ ]] à la place, comme il ne fait pas de division de mots et d'expansion de chemin d'accès à ses variables, cette citation peut ne pas être nécessaire à moins qu'elle fasse partie d'une expression.

[[ $# -ne 1 ]]

Il comporte également d’autres fonctionnalités telles que le regroupement de conditions non cotées, la correspondance de motifs (correspondance de motif étendue avec extglob) et correspondant à regex.

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

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

Pour les expressions arithmétiques pures, en utilisant (( )) pour certains peut-être encore mieux, mais ils sont encore possibles dans [[ ]] avec ses opérateurs arithmétiques comme -eq, -ne, -lt, -le, -gt, ou -ge en plaçant l'expression en tant qu'argument de chaîne unique:

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

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

Les références:


761
2017-09-02 08:30



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

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

53
2017-12-14 20:50



Sur []:! =, =, == ... sont chaîne les opérateurs de comparaison et -eq, -gt ... sont arithmétique ceux binaires.

J'utiliserais:

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

Ou:

if [ $# -eq 1 ]; then

28
2018-01-07 10:13



Si vous n'êtes intéressé que si un argument particulier manque, Substitution de paramètre c'est génial:

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

25
2017-10-16 05:32



Un simple doublure qui fonctionne peut être fait en utilisant:

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

Cela se décompose en:

  1. tester la variable bash pour la taille des paramètres $ # n'est pas égal à 1 (notre nombre de sous-commandes)
  2. si vrai alors appelez la fonction usage () et quittez avec le statut 1
  3. sinon appelez la fonction main ()

Pense à noter:

  • use () peut être simplement echo "$ 0: params"
  • main peut être un long script

11
2017-08-12 02:38



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
2017-11-19 01:23



Au cas où vous voudriez être du bon côté, je recommande d'utiliser des 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
2017-11-12 13:15