236 votes

Vérifier si la variable bash est égale à 0

J'ai une variable bash depth et je voudrais tester si elle est égale à 0. Si oui, je veux arrêter l'exécution du script. Jusqu'à présent, j'ai :

zero=0;

if [ $depth -eq $zero ]; then
    echo "false";
    exit;
fi

Malheureusement, cela conduit à :

 [: -eq: unary operator expected

(peut être un peu imprécis en raison de la traduction)

S'il vous plaît, comment puis-je modifier mon script pour que cela fonctionne ?

249voto

cyon Points 4365

On dirait que votre depth n'est pas définie. Cela signifie que l'expression [ $depth -eq $zero ] devient [ -eq 0 ] après que bash substitue les valeurs des variables dans l'expression. Le problème ici est que le -eq est utilisé à tort comme un opérateur n'ayant qu'un seul argument (le zéro), alors qu'il nécessite deux arguments. C'est pourquoi vous obtenez le opérateur unaire message d'erreur.

EDITAR: Comme Doktor J mentionné dans son commentaire sur cette réponse, un moyen sûr d'éviter les problèmes liés aux variables non définies dans les contrôles est d'enfermer les variables dans des fichiers "" . Voir son commentaire pour l'explication.

if [ "$depth" -eq "0" ]; then
   echo "false";
   exit;
fi

Une variable non définie utilisée avec l'option [ semble vide pour bash. Vous pouvez vérifier cela en utilisant les tests ci-dessous qui donnent tous la valeur suivante true porque xyz est soit vide, soit non défini :

  • if [ -z ] ; then echo "true"; else echo "false"; fi
  • xyz=""; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
  • unset xyz; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi

74voto

gubbaraviteja Points 91

Double parenthèse (( ... )) est utilisé pour les opérations arithmétiques.

Double crochets [[ ... ]] peut être utilisé pour comparer et examiner des nombres (seuls les entiers sont pris en charge), avec les opérateurs suivants :

· NUM1 -eq NUM2 returns true if NUM1 and NUM2 are numerically equal.

· NUM1 -ne NUM2 returns true if NUM1 and NUM2 are not numerically equal.

· NUM1 -gt NUM2 returns true if NUM1 is greater than NUM2.

· NUM1 -ge NUM2 returns true if NUM1 is greater than or equal to NUM2.

· NUM1 -lt NUM2 returns true if NUM1 is less than NUM2.

· NUM1 -le NUM2 returns true if NUM1 is less than or equal to NUM2.

Par exemple

if [[ $age > 21 ]] # bad, > is a string comparison operator

if [ $age > 21 ] # bad, > is a redirection operator

if [[ $age -gt 21 ]] # okay, but fails if $age is not numeric

if (( $age > 21 )) # best, $ on age is optional

25voto

Jacek Dominiak Points 314

Essayez :

zero=0;

if [[ $depth -eq $zero ]]; then
  echo "false";
  exit;
fi

20voto

Gurubaran Points 598

Vous pouvez également utiliser ce format et utiliser des opérateurs de comparaison comme "==" "<=".

  if (( $total == 0 )); then
      echo "No results for ${1}"
      return
  fi

6voto

Plus précisément : ((depth)) . Par exemple, l'impression suivante 1 .

declare -i x=0
((x)) && echo $x

x=1
((x)) && echo $x

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X