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?
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
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.
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 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 diriger avec -a
, par exemple:
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
...
fi