Opérateurs de comparaison et d'expression de Bash

11

Je suis nouveau à la programmation bash. J'ai lu deux bons, longs guides, mais ils ont fait un désordre dans ma tête sur les opérateurs et les mots clés.

Qui sont plus souvent et largement utilisé? Je ne sais pas quand utiliser qui et pourquoi.

  1. test, [[ ]]Ou [ ]ou même(( ))
  2. $((exp)) ou $[exp]
  3. -gtou >, geou , >=etc.
  4. quand utiliser <et >ou ( )et quand nous devons échapper avec , \: \< \(etc.
  5. ==ou =(comparaisons de chaînes)

Je sais que les différences fondamentales entre [et [[mais d' autres questions sont un mystère pour moi.

Merci d'avance

MikeD
la source
2
Un wiki très utile qui est à jour et mentionne beaucoup de bonnes pratiques est le wiki de Greg . Le guide Bash et la FAQ sur il sont particulièrement utiles.

Réponses:

5
  • testest un shell intégré qui (évidemment) teste une condition donnée. Quelques coquilles âgées ont besoin de commande spéciale. Donc , vous trouverez également un programme à /usr/bin/test.
  • [est également un programme pour tester une condition. Ce logiciel a également besoin d' un support de fermeture et vous pouvez le trouver à /usr/bin/[.
  • [[…]]est une alternative à testet [. Il a été développé pour le shell Korn ( ksh). Mais vous trouverez également dans les versions Bash supérieur à 2 et dans le Z Shell. Les doubles crochets ont des fonctionnalités intéressantes:
    • La coque ne fait pas la séparation de mots ou d'extension de nom de fichier.
    • Vous avez pas besoin de citer.
    • Au lieu de -a(ET) ou -o(OR) , vous pouvez utiliser &&ou ||.
    • Le =peut faire beaucoup plus.
  • ((…))est équivalent à let. Donc , fondamentalement , ((expression))est le même que let "expression". Cependant , avec letvous pouvez utiliser plus d'une expression, mais des accolades doubles permettent une seule expression.
  • $((…))(et $[…]) fait quelques calculs. Vous shell essaie de calculer l'expression entre les accolades et remplace l'expression par le résultat. Alors echo $((1+1))conduit à echo 2. Ainsi , vos coquilles imprime le numéro 2.

Chaque fois que vous voulez comparer deux chiffres que vous devez utiliser l'option avec un tiret et deux lettres ( -ge, -ltetc.). Si vous voulez comparer les chaînes , vous devez utiliser =ou !=.

Il est assez difficile de répondre à votre question concernant l'évasion. Parce que cela dépend du logiciel que vous utilisez en plus du shell. Donc, c'est à dire grepet ont grep -Ebesoin de s'échapper différents. Ceci est également le cas sed, awket d' autres. La meilleure option consiste donc à consulter la page de manuel. Après un certain temps, vous vous habituez et savez quand utiliser l'évasion.

qbi
la source
Merci. une autre question - car il est possible de faire des comparaisons avec ((...)) - est-il plus courant d'utiliser cette version: if ((2> 1)) OU ceci: if [[2 -gt 1]]
MikeD
Je suppose que if [ 2 -gt 1 ]; …c'est plus courant, car je le vois plus souvent dans les scripts shell et, pour autant que je sache, c'est compatible POSIX.
qbi
Une autre chose à garder à l'esprit est que [expression] est vraie si l'expression est évaluée à / retourne zéro, mais ((expression)) est vraie si l'expression est évaluée à / retourne non nulle.
Joe