Ce que vous avez écrit fonctionne presque (cela fonctionnerait si toutes les variables étaient des nombres), mais ce n'est pas du tout une manière idiomatique.
-
(…)
Les parenthèses indiquent une Sous-coque . Ce qui se trouve à l'intérieur n'est pas une expression comme dans beaucoup d'autres langues. Il s'agit d'une liste de commandes (comme à l'extérieur des parenthèses). Ces commandes sont exécutées dans un sous-processus distinct, de sorte que toute redirection, affectation, etc. effectuée à l'intérieur des parenthèses n'a aucun effet à l'extérieur de celles-ci.
- Avec un signe de dollar en tête,
$(…)
est un substitution de commande il y a une commande à l'intérieur des parenthèses, et la sortie de la commande est utilisée comme partie de la ligne de commande (après des expansions supplémentaires, sauf si la substitution est entre guillemets doubles, mais c'est une autre histoire ).
-
{ … }
Les accolades sont comme les parenthèses en ce sens qu'elles regroupent les commandes, mais elles n'influencent que l'analyse syntaxique, pas le regroupement. Le programme x=2; { x=4; }; echo $x
imprime 4, alors que x=2; (x=4); echo $x
imprime 2. (Les accolades doivent être entourées d'espaces et d'un point-virgule avant la fermeture, alors que les parenthèses ne le sont pas. C'est juste une bizarrerie de la syntaxe).
- Avec un signe de dollar en tête,
${VAR}
est un expansion des paramètres en élargissant à la valeur d'une variable, avec d'éventuelles transformations supplémentaires.
-
((…))
Les doubles parenthèses entourent un instruction arithmétique c'est-à-dire un calcul sur des entiers, avec une syntaxe ressemblant à celle des autres langages de programmation. Cette syntaxe est surtout utilisée pour les affectations et dans les conditionnels.
- La même syntaxe est utilisée dans les expressions arithmétiques
$((…))
qui s'étendent à la valeur entière de l'expression.
-
[[ … ]]
entourage à double parenthèse expressions conditionnelles . Les expressions conditionnelles sont principalement construites sur opérateurs comme -n $variable
pour tester si une variable est vide et -e $file
pour tester si un fichier existe. Il existe également des opérateurs d'égalité de chaînes de caractères : "$string1" == "$string2"
(attention au fait que le côté droit est un motif, par ex. [[ $foo == a* ]]
vérifie si $foo
commence par a
tandis que [[ $foo == "a*" ]]
vérifie si $foo
est exactement a*
), et le familier !
, &&
et ||
des opérateurs de négation, de conjonction et de disjonction, ainsi que des parenthèses pour le regroupement. Notez que vous avez besoin d'un espace autour de chaque opérateur (par ex. [[ "$x" == "$y" ]]
pas [[ "$x"=="$y" ]]
), et un espace ou un caractère comme ;
à l'intérieur et à l'extérieur des parenthèses (par ex. [[ -n $foo ]]
pas [[-n $foo]]
).
-
[ … ]
Les parenthèses simples sont une forme alternative d'expressions conditionnelles avec plus de bizarreries (mais plus anciennes et plus portables). N'en écrivez pas pour l'instant ; commencez à vous en préoccuper lorsque vous trouverez des scripts qui en contiennent.
C'est la manière idiomatique d'écrire votre test en bash :
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Si vous avez besoin d'une portabilité vers d'autres shells, c'est ce qu'il faut faire (notez les guillemets supplémentaires et les séries de parenthèses séparées autour de chaque test individuel, et l'utilisation du traditionnel =
plutôt que l'opérateur ksh/bash/zsh ==
variante) :
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then