J'essaie d'écrire un script qui vérifiera deux indicateurs d'erreur, et au cas où un indicateur (ou les deux) serait modifié, il fera écho - une erreur s'est produite. Mon scénario:
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, cela devrait être quelque chose le long:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
L'erreur que j'obtiens 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 supports sont-ils foirés?
bash
if-statement
flags
Simplement moi
la source
la source
a==1 or b==2
couvre déjà le cas oùa==1 and b==2
. Tester séparément pour cela est complètement superflu ici.Réponses:
Utilisez les opérations
-a
(pour et) et-o
(pour ou).tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Mettre à jour
En fait, vous pouvez toujours utiliser
&&
et||
avec l'-eq
opération. Donc, votre script serait comme ceci: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:
la source
[
et]
pour le regroupement (ils ne le font pas), et le fait de ne pas mettre d'espaces autour de l'opérateur (par exemple"$my_error_flag"="1"
), ce qui empêche le shell de le reconnaître comme un opérateur du tout. Veuillez lire BashFAQ # 17 (sur le regroupement) et # 31 (sur la différence entre les différents types d'expression de test) . En fait, dans ce cas, il serait encore plus facile d'utiliser une expression arithmétique .-a
et-o
sont considérés comme obsolètes par la spécification POSIX ; utilisez des tests séparés combinés avec||
comme dans la mise à jour.{}
devrait également être possible.Vous pouvez utiliser l'un
[[
ou l' autre((
mot - clé. Lorsque vous utilisez[[
mot - clé, vous devez les opérateurs de chaîne d'utilisation tels que-eq
,-lt
. Je pense que((
c'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érateurUtilisation de l'
((
opérateurNe pas utiliser
-a
ni-o
opérateurs car il n'est pas portable.la source
Veuillez essayer de suivre
la source
( ... )
crée des sous-couches - beaucoup d'impact sur les performances sans aucun avantage.{ ...; }
pour le regroupement sans création de sous-shell.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 script le montre, vous pouvez les canaliser avec
-a
, par exemple:la source
-a
est marqué comme obsolescent dans la version actuelle dutest
standard POSIX ; voir lesOB
marqueurs sur pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Utilisez[ -z "$FOO" ] && [ -z "$BAR" ]
pour avoir un code plus fiable.