web-dev-qa-db-fra.com

Script Bash, conditions multiples dans la boucle while

J'essaie de faire fonctionner une boucle while simple dans bash qui utilise deux conditions, mais après avoir essayé de nombreuses syntaxes différentes à partir de divers forums, je ne peux pas m'empêcher de lancer une erreur. Voici ce que j'ai

while [ $stats -gt 300 ] -o [ $stats -eq 0 ]

J'ai aussi essayé:

while [[ $stats -gt 300 ] || [ $stats -eq 0 ]]

... ainsi que plusieurs autres constructions. Je veux que cette boucle continue alors que $stats is > 300 ou si $stats = 0.

45
jake9115

Les options correctes sont (par ordre croissant de recommandation):

# Single POSIX test command with -o operator (not recommended anymore).
# Quotes strongly recommended to guard against empty or undefined variables.
while [ "$stats" -gt 300 -o "$stats" -eq 0 ]

# Two POSIX test commands joined in a list with ||.
# Quotes strongly recommended to guard against empty or undefined variables.
while [ "$stats" -gt 300 ] || [ "$stats" -eq 0 ]

# Two bash conditional expressions joined in a list with ||.
while [[ $stats -gt 300 ]] || [[ $stats -eq 0 ]]

# A single bash conditional expression with the || operator.
while [[ $stats -gt 300 || $stats -eq 0 ]]

# Two bash arithmetic expressions joined in a list with ||.
# $ optional, as a string can only be interpreted as a variable
while (( stats > 300 )) || (( stats == 0 ))

# And finally, a single bash arithmetic expression with the || operator.
# $ optional, as a string can only be interpreted as a variable
while (( stats > 300 || stats == 0 ))

Quelques notes:

  1. Citer les extensions de paramètres à l'intérieur de [[ ... ]] et ((...)) est facultatif; si la variable n'est pas définie, -gt et -eq prendra une valeur de 0.

  2. En utilisant $ est facultatif à l'intérieur de (( ... )), mais son utilisation peut aider à éviter les erreurs involontaires. Si stats n'est pas défini, alors (( stats > 300 )) assumera stats == 0, mais (( $stats > 300 )) produira une erreur de syntaxe.

105
chepner

Essayer:

while [ $stats -gt 300 -o $stats -eq 0 ]

[ est un appel à test. Ce n'est pas juste pour le regroupement, comme les parenthèses dans d'autres langues. Vérifier man [ ou man test pour plus d'informations.

1
drewmm

Les extra [] à l'extérieur de votre deuxième syntaxe ne sont pas nécessaires et peuvent prêter à confusion. Vous pouvez les utiliser, mais si vous devez, vous devez disposer d'espaces entre eux.

Alternativement:

while [ $stats -gt 300 ] || [ $stats -eq 0 ]
0
Lighthart