J'ai une profondeur variable bash et je voudrais tester si elle vaut 0. Dans le cas 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 inexact à cause de la traduction)
S'il vous plaît, comment puis-je modifier mon script pour le faire fonctionner?
On dirait que votre variable depth
n'est pas définie. Cela signifie que l'expression [ $depth -eq $zero ]
devient [ -eq 0 ]
après que bash ait remplacé les valeurs des variables dans l'expression. Le problème ici est que l'opérateur -eq
n'est pas utilisé correctement en tant qu'opérateur avec un seul argument (le zéro), mais il nécessite deux arguments. C'est pourquoi vous obtenez le message d'erreur opérateur unaire.
MODIFIER: Comme Doktor J mentionné dans son commentaire sur cette réponse, un moyen sûr d'éviter les problèmes de variables non définies dans les contrôles consiste à inclure les variables dans ""
. Voir son commentaire pour l'explication.
if [ "$depth" -eq "0" ]; then
echo "false";
exit;
fi
Une variable non définie utilisée avec la commande [
apparaît vide à bash. Vous pouvez le vérifier en utilisant les tests ci-dessous, qui ont tous pour résultat true
parce que xyz
est vide ou 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
La double parenthèse (( ... ))
est utilisée pour les opérations arithmétiques.
Les doubles crochets [[ ... ]]
peuvent être utilisés 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
Essayer:
zero=0;
if [[ $depth -eq $zero ]]; then
echo "false";
exit;
fi
vous pouvez également utiliser ce format et utiliser des opérateurs de comparaison tels que '==' '<='
if (( $total == 0 )); then
echo "No results for ${1}"
return
fi
Plus précisément: ((depth))
. Par exemple, ce qui suit imprime 1
.
declare -i x=0
((x)) && echo $x
x=1
((x)) && echo $x
Vous pouvez essayer ceci:
: ${depth?"Error Message"} ## when your depth variable is not even declared or is unset.
NOTE: Ici, c'est juste ?
après depth
.
ou
: ${depth:?"Error Message"} ## when your depth variable is declared but is null like: "depth=".
NOTE: Ici, il s'agit de :?
après depth
.
Ici, si la variable depth
est trouvée null
, le message d'erreur sera imprimé, puis quitté.