Bash si l'instruction avec de multiples conditions déclenche une erreur
Je suis en train d'écrire un script qui se chargera de vérifier les deux indicateurs d'erreur, et dans le cas où un drapeau (ou les deux) sont modifiés, il vais echo-- erreur qui s'est passé. 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, mais quelque chose d':
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'
Sont mes supports foiré?
- Check this out:theunixshell.blogspot.com/2013/05/...
- L'utilisation des parenthèses - ()
- Voir aussi stackoverflow.com/questions/3826425/...
- Logiquement,
a==1 or b==2
couvre déjà le cas oùa==1 and b==2
. Les tests séparément pour ce qui est complètement inutile ici.
Vous devez vous connecter pour publier un commentaire.
Utilisation
-a
(pour et) et-o
(ou) des opérations.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Mise à jour
En fait, vous pouvez toujours utiliser
&&
et||
avec le-eq
opération. Si votre script ne sera comme ceci:Bien que dans votre cas, vous pouvez ignorer les deux dernières expressions et simplement s'en tenir à l'un ou de l'exploitation comme ceci:
[
et]
pour le groupement (ils ne font pas que), et à défaut de mettre des 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 à tous. Merci de 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 à utiliser expression arithmétique.-a
et-o
sont considérés comme obsolètes par le spécification POSIX; utiliser des tests combinés avec||
comme dans la mise à jour.{}
devrait également être possible.Vous pouvez utiliser
[[
ou((
mot-clé. Lorsque vous utilisez[[
mot-clé, vous devez utiliser des chaînes de caractères, des opérateurs comme-eq
,-lt
. Je pense que,((
est le plus préféré pour l'arithmétique, parce que vous pouvez utiliser directement les opérateurs tels que les==
,<
et>
.À l'aide de
[[
opérateurÀ l'aide de
((
opérateurNe pas utiliser
-a
ou-o
opérateurs Puisqu'il n'est pas Portable.S'il vous plaît essayer suivantes
( ... )
crée sous-coquille-beaucoup d'impact sur les performances pour aucun avantage.{ ...; }
pour le regroupement sans shell interne est exécuté création.Vous pouvez obtenir un peu d'inspiration par la lecture d'un
entrypoint.sh
script écrite par les contributeurs de MySQL qui vérifie si les variables ont été mis en.Que le script affiche, vous pouvez pipe avec
-a
, par exemple:-a
est marqué comme obsolète dans la version actuelle de la norme POSIXtest
standard; voir laOB
marqueurs de pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html. Utilisation[ -z "$FOO" ] && [ -z "$BAR" ]
pour avoir plus de code fiable.