Stations de travail en ligne OnWorks Linux et Windows

Logo

Hébergement gratuit en ligne pour les postes de travail

<Précédent | Table des matières | Suivant>

Combiner des expressions

Il est également possible de combiner des expressions pour créer des évaluations plus complexes. Les expressions sont combinées à l'aide d'opérateurs logiques. Nous les avons vus au chapitre 17, lorsque nous avons appris la trouver commander. Il y a trois opérations logiques pour tester ainsi que [[]]. Ils sont ET, OU et NON. tester ainsi que [[]] utiliser différents opérateurs pour représenter ces opérations :


Tableau 27-4 : Opérateurs logiques


Opération TESt [[ ]] et (( ))

Opération TESt [[ ]] et (( ))

ET -une &&


image

OR -o ||


image

ne pas ! !


image


Voici un exemple d'opération AND. Le script suivant détermine si un entier se trouve dans une plage de valeurs :



#! / Bin / bash


# test-integer3 : détermine si un entier est dans un

# plage de valeurs spécifiée.


MIN_VAL=1 MAX_VAL=100


INT=50

#! / Bin / bash


# test-integer3 : détermine si un entier est dans un

# plage de valeurs spécifiée.


MIN_VAL=1 MAX_VAL=100


INT=50



if [[ "$INT" =~ ^-?[0-9]+$ ]]; alors

si [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; then echo "$INT est compris entre $MIN_VAL et $MAX_VAL."

d'autre

echo "$INT est hors limites."

fi d'autre

echo "INT n'est pas un entier." >&2 sortie 1

fi


if [[ "$INT" =~ ^-?[0-9]+$ ]]; alors

si [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; then echo "$INT est compris entre $MIN_VAL et $MAX_VAL."

d'autre

echo "$INT est hors limites."

fi d'autre

echo "INT n'est pas un entier." >&2 sortie 1

fi


Dans ce script, nous déterminons si la valeur de l'entier INT se situe entre les valeurs de MIN_VAL ainsi que MAX_VAL. Ceci est réalisé par une seule utilisation de [[]], qui comprend deux expressions séparées par le && opérateur. Nous aurions également pu coder cela en utilisant tester:


if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; then echo "$INT est compris entre $MIN_VAL et $MAX_VAL."

d'autre

echo "$INT est hors limites."

fi

if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; then echo "$INT est compris entre $MIN_VAL et $MAX_VAL."

d'autre

echo "$INT est hors limites."

fi


La ! L'opérateur de négation inverse le résultat d'une expression. Il renvoie vrai si une expression est fausse, et il renvoie faux si une expression est vraie. Dans le script suivant, nous modifions la logique de notre évaluation pour trouver les valeurs de INT qui sont en dehors de la plage spécifiée :



#! / Bin / bash


# test-integer4 : détermine si un entier est en dehors d'un

# plage de valeurs spécifiée.


MIN_VAL=1 MAX_VAL=100


INT=50


if [[ "$INT" =~ ^-?[0-9]+$ ]]; alors

si [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; then echo "$INT est en dehors de $MIN_VAL à $MAX_VAL."

d'autre

echo "$INT est dans la plage."

#! / Bin / bash


# test-integer4 : détermine si un entier est en dehors d'un

# plage de valeurs spécifiée.


MIN_VAL=1 MAX_VAL=100


INT=50


if [[ "$INT" =~ ^-?[0-9]+$ ]]; alors

si [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; then echo "$INT est en dehors de $MIN_VAL à $MAX_VAL."

d'autre

echo "$INT est dans la plage."



echo "INT n'est pas un entier." >&2 sortie 1

fi


echo "INT n'est pas un entier." >&2 sortie 1

fi

Nous incluons également des parenthèses autour de l'expression, pour le regroupement. Si elles n'étaient pas incluses, la négation ne s'appliquerait qu'à la première expression et non à la combinaison des deux. Codage avec tester se ferait de cette façon :


si [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; then echo "$INT est en dehors de $MIN_VAL à $MAX_VAL."

d'autre

echo "$INT est dans la plage."

fi

si [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; then echo "$INT est en dehors de $MIN_VAL à $MAX_VAL."

d'autre

echo "$INT est dans la plage."

fi


Étant donné que toutes les expressions et tous les opérateurs utilisés par tester sont traités comme des arguments de commande par le shell (contrairement à [[]] ainsi que (( )) ), caractères qui ont une signification particulière pour bash tels que <, >, (et ), doit être entre guillemets ou échappé.

image

Vu que tester ainsi que [[]] faire à peu près la même chose, qu'est-ce qui est préférable ? tester est traditionnel (et fait partie de POSIX), alors que [[]] est spécifique à bash. Il est important de savoir utiliser tester, car il est très largement utilisé, mais [[]] est clairement plus utile et plus facile à coder, il est donc préférable pour les scripts modernes.


La portabilité est le hobgoblin des petits esprits

Si vous parlez à de "vraies" personnes Unix, vous découvrirez rapidement que beaucoup d'entre elles n'aiment pas beaucoup Linux. Ils le considèrent comme impur et impur. L'un des principes des utilisateurs d'Unix est que tout doit être « portable ». Cela signifie que tout script que vous écrivez devrait pouvoir s'exécuter, sans changement, sur n'importe quel système de type Unix.

Les utilisateurs d'Unix ont de bonnes raisons de le croire. Ayant vu ce que les extensions propriétaires des commandes et des shells ont fait au monde Unix avant POSIX, ils se méfient naturellement des effets de Linux sur leur OS bien-aimé.

Mais la portabilité a un sérieux inconvénient. Il empêche le progrès. Cela exige que les choses soient toujours faites en utilisant des techniques du « plus petit dénominateur commun ». Dans le cas de la programmation shell, cela signifie rendre tout compatible avec sh, le shell Bourne original.



image

Cet inconvénient est l'excuse que les éditeurs de logiciels propriétaires utilisent pour justifier leurs extensions propriétaires, seulement ils les appellent « innovations ». Mais ce ne sont en réalité que des dispositifs de verrouillage pour leurs clients.

Les outils GNU, tels que bash, n'ont pas de telles restrictions. Ils encouragent la portabilité en soutenant les normes et en étant universellement disponibles. Vous pouvez installer bash et les autres outils GNU sur presque tout type de système, même Windows, sans frais. Alors n'hésitez pas à utiliser toutes les fonctionnalités de bash. Il est vraiment portable.


Meilleur système d'exploitation Cloud Computing chez OnWorks :