Si vous souhaitez exprimer le test suivant en shell (sh):
if ( a == 1 && ( b == 1 || b == 2 )) { ... }
Jusqu'à présent, le meilleur que j'ai pu écrire est le suivant:
if [[ $a -eq 1 ]]; then
if [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
fi
Je ne sais pas comment composer && et || avec une priorité correcte. La recherche sur Google ne m'a donné aucune réponse (les didacticiels ne donnent que des exemples de base, le cas échéant)
Quelle est la syntaxe pour combiner ces deux si en un seul?
ksh
? Ensuite, votre code initial ne nécessiterait qu'une autre paire de parenthèses:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
Réponses:
Notez que ce
[[ ]]
n'est pas dans Bourne ou POSIXsh
. Pour une véritablesh
syntaxe, il existe plusieurs façons de procéder.Utiliser une seule
[ ]
paireou Éviter le POSIX
-a
et les-o
options 11 L' une des raisons pour éviter
-a
et-o
est une portabilité maximale - pas touttest
ou[
mises en œuvre peuvent gérer plus de 4 arguments, ce qui est précisément ce que vous obtenez si vous enchaînez avec des expressions-a
et-o
et\( \)
.la source
/bin/sh
, il est incorrect d'écrire le script en utilisant des fonctionnalités absentessh
. Vous devez savoir que ceksh
n'est PASsh
, mais plutôt un surensemble desh
. Si vous apportez votreksh
-but-declare-as-sh
script à un système où ilsh
n'y a pas de lien symboliqueksh
, il peut se casser. Vous pouvez éviter ce problème en vous assurant que votre script correspond à la déclaration./bin/sh
va invoquer/bin/sh
. Le problème n'est/bin/sh
pas accepté[[
. Vous ne pouvez pas utiliser[[
ou utiliser un shell qui accepte[[
, par exempleksh
, comme votre shebang.-a
/ qui-o
ne sont pas pris en charge par certaines implémentations mais ce n'est pas fiable pour des arguments arbitraires. Like[ "$a" = "$b" -o "$b" = "$c" ]
échouerait pour des valeurs de$a
like!
avec de nombreuses[
implémentations.J'ai essayé une syntaxe et j'ai trouvé que
travaille.
la source
Une autre approche POSIX:
la source
La bonne façon de le faire avec un simple
shell
:Explication:
test
sert ici de parenthèse et-o
de logique ou. Si vous une logique et à l'intérieur de la "parenthèse", vous utiliseriez-a
.Pour en savoir plus, cliquez ici
la source