Scripting di Bash, più condizioni nel ciclo while

Sto cercando di ottenere un semplice ciclo while che funzioni in bash che utilizza due condizioni, ma dopo aver provato molte syntax diverse da vari forum, non riesco a smettere di lanciare un errore. Ecco cosa ho:

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

Ho anche provato:

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

… così come molti altri costrutti. Voglio che questo ciclo continui mentre $stats is > 300 o se $stats = 0 .

Le opzioni corrette sono (in ordine crescente di raccomandazione):

 # 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 )) 

Alcune note:

  1. La quotazione delle espansioni dei parametri all’interno di [[ ... ]] e ((...)) è facoltativa; se la variabile non è impostata, -gt e -eq assumeranno il valore 0.

  2. L’utilizzo di $ è facoltativo all’interno (( ... )) , ma l’utilizzo può aiutare a evitare errori non intenzionali. Se le stats non sono impostate, allora (( stats > 300 )) assumerà stats == 0 , ma (( $stats > 300 )) produrrà un errore di syntax.

Provare:

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

[ è una chiamata da test . Non è solo per il raggruppamento, come le parentesi in altre lingue. Controlla l’ man [ o l’ man test per maggiori informazioni.

L’extra [] all’esterno della seconda syntax non è necessario e potrebbe confondere. Puoi usarli, ma se devi devi avere uno spazio bianco tra di loro.

In alternativa:

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