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

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

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

je reçois

[: : integer expression expected

Comment puis-je vérifier l'entrée argument1 d'abord pour voir si il existe?

944
demandé sur Brad Parks 2011-06-26 09:49:21

9 réponses

C'est:

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

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

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

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

le commutateur -z vérifiera si l'extension de "$1 " est une chaîne nulle ou non. Si c'est une chaîne nulle, alors le corps est exécuté.

1670
répondu phoxis 2015-11-09 15:35:42

il vaut mieux démontrer de cette façon

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

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

227
répondu Val 2016-01-16 06:17:47

si vous êtes seulement intéressé à détecter si un argument particulier est manquant, paramètre de substitution est grand:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: "151900920" 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 est passé d'un argument au script, et si non, revenir à une valeur par défaut. Comme dans le script ci-dessous:

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

ici si l'utilisateur n'a pas passé scale comme deuxième paramètre, je lance é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} qui jeux undefined varname au lieu de retourner le word valeur;
  • ${varname:?message} qui 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 renvoie word seulement si varname est défini et n'est pas null; retourne null sinon.
70
répondu Aleks N. 2016-09-20 11:22:20

, Essayez:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi
27
répondu Ranjithkumar T 2015-11-25 11:03:38

une Autre façon de détecter si les arguments passés au script:

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

Note que (( expr )) les causes de l'évaluation de l'expression que par les règles de Shell " Arithmétique .

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

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

Another (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.
27
répondu devnull 2016-01-07 16:13:49

j'utilise souvent cet extrait pour des scripts simples:

#!/bin/bash

if [ -z "" ]; then
    echo -e "\nPlease call '"151900920" <argument>' to run this command!\n"
    exit 1
fi
11
répondu f2cx 2017-12-29 17:55:39

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

je tiens à m'assurer que mon $vars sont ints par

var=$(( var + 0 ))

avant que je les teste, juste pour se défendre contre l'erreur" [: integer arg required".

3
répondu Cwissy 2015-11-09 15:37:33

Si vous souhaitez vérifier si l'argument n'existe, vous pouvez vérifier si le nombre d'arguments est supérieur ou égal à votre cible numéro d'argument.

le script suivant montre comment cela fonctionne

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

produit la sortie suivante

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
3
répondu Brad Parks 2017-09-13 16:45:19

seulement parce qu'il y a plus de point de base pour faire remarquer que je vais ajouter que vous pouvez simplement tester votre chaîne de caractères est null:

if [ "" ]; then
  echo yes
else
  echo no
fi

de même si vous attendez arg compte juste tester votre dernier:

if [ "" ]; then
  echo has args correct or not
else
  echo fixme
fi

et ainsi de suite avec tout arg ou var

2
répondu seorphates 2018-08-02 21:00:31