Question Vérifier l'existence de l'argument d'entrée dans un script shell Bash


J'ai besoin de vérifier l'existence d'un argument d'entrée. J'ai le script suivant

if [ "$1" -gt "-1" ]
  then echo hi
fi

Je reçois

[: : integer expression expected

Comment puis-je d'abord vérifier l'argument d'entrée1 pour voir s'il existe?


896
2018-06-26 05:49


origine


Réponses:


C'est:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

le $# variable vous dira le nombre d'arguments d'entrée que le script a été passé.

Ou vous pouvez vérifier si un argument est une chaîne vide ou non comme:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

le -z switch testera si l'expansion de "$ 1" est une chaîne nulle ou non. Si c'est une chaîne nulle, alors le corps est exécuté.


1600
2018-06-26 05:55



Il est préférable de démontrer de cette façon

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

Vous devez normalement quitter si vous avez trop peu d'arguments.


215
2017-11-13 19:25



Si vous êtes uniquement intéressé par la détection d'un argument particulier, 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

Dans certains cas, vous devez vérifier si l'utilisateur a passé un argument au script et, dans le cas contraire, revenir à une valeur par défaut. Comme dans le script ci-dessous:

scale=${2:-1}
emulator @$1 -scale $scale

Ici si l'utilisateur n'a pas passé scale en tant que 2ème paramètre, je lance l'émulateur Android avec -scale 1 par défaut. ${varname:-word} est un opérateur d'extension. Il y a aussi d'autres opérateurs d'expansion:

  • ${varname:=word} lequel ensembles l'indéfini varname au lieu de retourner le word valeur;
  • ${varname:?message} qui soit retourne varname si elle est définie et n'est pas nulle ou imprime le message et annule le script (comme le premier exemple);
  • ${varname:+word} qui revient word seulement si varname est défini et n'est pas nul; renvoie null sinon.

66
2017-07-31 18:55



Essayer:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

26
2017-10-21 04:20



Une autre façon de détecter si les arguments ont été passés au script:

((!$#)) && echo No arguments supplied!

Notez que (( expr )) provoque l'expression à évaluer selon les règles de Shell arithmétique.

Pour sortir en l'absence de tout argument, on peut dire:

((!$#)) && echo No arguments supplied! && exit 1

Un autre (analogue) façon de dire ce qui précède serait:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let dit:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

26
2017-07-20 10:26



J'utilise souvent cet extrait pour des scripts simples:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

10
2017-12-29 17:55



Pour rappel, les opérateurs de test numériques de Bash ne fonctionnent que sur des entiers (-eq, -lt, -ge, etc.)

J'aime m'assurer que mes $ vars sont ints par

var=$(( var + 0 ))

avant de les tester, juste pour me défendre contre l'erreur "[: integer arg required".


3
2017-10-24 22:39