Bash si l’instruction avec plusieurs conditions génère une erreur

J’essaie d’écrire un script qui vérifie deux drapeaux d’erreur, et au cas où un drapeau (ou les deux) serait modifié, cela ferait écho – une erreur s’est produite. Mon script:

my_error_flag=0 my_error_flag_o=0 do something..... if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then echo "$my_error_flag" else echo "no flag" fi 

En gros, ça devrait être quelque chose:

 if ((a=1 or b=2) or (a=1 and b=2)) then display error else no error fi 

L’erreur que je reçois est:

  line 26: conditional binary operator expected line 26: syntax error near `]' line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then' 

Est-ce que mes parenthèses sont en désordre?

Utilisez les opérations -a (for and) et -o (for ou).

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

Mettre à jour

En fait, vous pouvez toujours utiliser && et || avec l’opération -eq . Donc, votre script serait comme ceci:

 my_error_flag=1 my_error_flag_o=1 if [ $my_error_flag -eq 1 ] || [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then echo "$my_error_flag" else echo "no flag" fi 

Bien que dans votre cas, vous pouvez ignorer les deux dernières expressions et vous en tenir à une opération comme celle-ci:

 my_error_flag=1 my_error_flag_o=1 if [ $my_error_flag -eq 1 ] || [ $my_error_flag_o -eq 2 ]; then echo "$my_error_flag" else echo "no flag" fi 

Vous pouvez utiliser soit [[ ou (( mot-clé). Lorsque vous utilisez [[ mot-clé], vous devez utiliser des opérateurs de chaîne tels que -lt , -lt . Je pense (( préférez l’arithmétique, car vous pouvez directement utiliser des opérateurs tels que comme == , < et > .

Utiliser [[ opérateur]

 a=$1 b=$2 if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]] then echo "Error" else echo "No Error" fi 

Utilisation de (( opérateur

 a=$1 b=$2 if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 )) then echo "Error" else echo "No Error" fi 

N'utilisez pas les opérateurs -a ou -o Comme ce n'est pas portable.

S’il vous plaît essayer de suivre

 if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ; then echo "WORKING" else echo "Out of range!" 

Vous pouvez vous inspirer en lisant un script entrypoint.sh écrit par les consortingbuteurs de MySQL qui vérifie si les variables spécifiées ont été définies.

Comme le montre le script, vous pouvez les -a avec -a , par exemple:

 if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then ... fi