web-dev-qa-db-fra.com

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

Je dois 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 vérifier d'abord l'entrée argument1 pour voir s'il existe?

1151
user775187

Il 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 été transmis.

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

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

Le commutateur -z testera si le développement de "$ 1" est une chaîne nulle ou non. S'il s'agit d'une chaîne nulle, le corps est exécuté.

2003
phoxis

Il vaut mieux 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.

296
Val

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 comme second paramètre, je lance l'émulateur Android avec -scale 1 par défaut. ${varname:-Word} est un opérateur d'expansion. Il existe également d'autres opérateurs d'expansion:

  • ${varname:=Word} qui définit le varname non défini au lieu de renvoyer la valeur Word;
  • ${varname:?message} qui retourne varname s'il est défini et n'est pas nul ou imprime le message et annule le script (comme dans le premier exemple);
  • ${varname:+Word} qui retourne Word seulement si varname est défini et n'est pas nul; renvoie null sinon.
91
Aleks N.

Essayer:

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

Une autre façon de détecter si des arguments ont été transmis au script:

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

Notez que (( expr )) provoque l'évaluation de l'expression selon les règles de arithmétique en shell .

Pour sortir en l'absence d'arguments, on peut dire:

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

Une autre manière (analogue) 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.
35
devnull

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
21
f2cx

Ce n'est que parce qu'il y a un point plus bas à souligner que j'ajouterai que vous pouvez simplement tester que votre chaîne est nulle:

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

De même, si vous attendez arg count, testez simplement votre dernier:

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

et ainsi de suite avec n'importe quel arg ou var

10
seorphates

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

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
Brad Parks

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 reçus par

var=$(( var + 0 ))

avant de les tester, il suffit de se défendre contre l'erreur "[: integer arg required required".

3
Cwissy