web-dev-qa-db-fra.com

Bash si la déclaration avec plusieurs conditions génère une erreur

J'essaie d'écrire un script qui vérifie deux indicateurs d'erreur, et si un indicateur (ou les deux) est modifié, il va écho - une erreur est survenue. 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

Fondamentalement, il devrait être quelque chose de long:

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'

Mes crochets sont-ils foirés?

138
Simply_me

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

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

Mise à jour

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

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 supprimer les deux dernières expressions et vous en tenir à une ou 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
207
mkhatib

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

Utilisation de l'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 l'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 car ce n'est pas Portable.

53
Fizer Khan

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

Vous pouvez vous inspirer en lisant un entrypoint.shscript é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 diriger avec -a, par exemple:

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