Je travaille avec Bash 3 et j'essaye de former un conditionnel. En C / C ++, sa mort simple: ((A || B) && C)
. Dans Bash, cela ne s'est pas avéré (je pense que les auteurs Git ont dû contribuer à ce code avant de passer à d'autres projets).
Cela ne fonctionne pas. Notez que ce <0 or 1>
n'est pas un littéral de chaîne; cela signifie un 0 ou 1 (vient généralement de grep -i
).
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
Il en résulte:
line 322: syntax error near unexpected token `[['
J'ai ensuite essayé:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
il en résulte:
line 322: syntax error near unexpected token `[['
Une partie du problème est que les résultats de recherche sont les exemples triviaux, et non les exemples plus complexes avec des conditions composées.
Comment effectuer un simple ((A || B) && C)
dans Bash?
Je suis prêt à le dérouler et à répéter les mêmes commandes dans plusieurs blocs:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
[[ … ]]
été ajouté dans bash 2.02.((…))
a été ajouté dans bash 2.0.||
et&&
passe de[
à[[
et((
. L' égalité de priorité dans[
(utilisation parenthèses pour contrôler l'ordre d'évaluation), mais && a une priorité plus élevée dans[[
et((
que||
(comme dans C).Utilisation
[[
:Si vous préférez
[
, les travaux suivants:la source
Utilisez l'
-o
opérateur au lieu de votre || imbriqué. Vous pouvez également utiliser-a
pour remplacer && si nécessaire dans vos autres déclarations.la source
-a
et-o
, mais je ne l'ai pas expérimenté. Quelqu'un sur Stack Overflow a dit de l'éviter. Je suis surtout d'accord avec eux car le script est moins lisible en les utilisant.[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
vous des problèmes avec eux?bash
ou tout autre shell qui comprend[[ ... ]]
.