195 votes

L'instruction Bash if avec plusieurs conditions provoque une erreur

J'essaie d'écrire un script qui vérifiera deux drapeaux d'erreur, et dans le cas où un drapeau (ou les deux) sont modifiés, il fera é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 du genre :

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 la suivante :

 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'

Mes parenthèses sont-elles abîmées ?

300voto

mkhatib Points 650

Utilisez -a (pour et) et -o (pour ou) opérations.

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

Mise à jour

En fait, vous pouvez toujours utiliser && y || avec le -eq opération. 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 écarter les deux dernières expressions et vous contenter d'une seule ou d'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

87voto

Fizer Khan Points 4128

Vous pouvez utiliser soit [[ o (( mot-clé. Lorsque vous utilisez [[ vous devez utiliser des opérateurs de chaîne tels que -eq , -lt . Je pense, (( est préférable pour l'arithmétique, car vous pouvez utiliser directement des opérateurs tels que == , < y > .

Utilisation de [[ 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

Ne pas utiliser -a o -o opérateurs Puisqu'il n'est pas portable.

9voto

Manash Nath Points 99

Veuillez essayer ce qui suit

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!"

1voto

Vous pouvez trouver de l'inspiration en lisant un entrypoint.sh script écrit par les contributeurs de MySQL qui vérifie si les variables spécifiées ont été définies.

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

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

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