quelle est la différence entre if et [[en bash?

je vois ça

if cmd then echo Hi fi 

fonctionne différemment de

 if [[ $(cmd) ]] then echo Hi fi 

Alors qu'est-ce qui se passe quand il y a un [[et quand il n'y en a pas?

Dans le shell [ est un alias pour la command de test. C'est la command. Le [[ est une caractéristique de certaines coquilles qui n'est que légèrement différente. En bash c'est un mot-key, plutôt qu'une command, mais fonctionne comme une command.

Vous pouvez penser de cette façon: vous exécutez [[ et fournit la sortie de "$ (cmd)" comme arguments à cette command. if alors vérifie le statut de return de [[ . Quand aucun opérateur n'est donné à [[ , -n est implicite.

  -n ssortingng True if the length of ssortingng is non-zero. 

Pour vos exemples:

 if cmd # check the return status of cmd if [[ $(cmd) ]] # check if cmd has any output 

Une instruction if expr (sans parenthèses) vérifie le statut de return de expr après son évaluation en tant que command bash. En cas de succès, il est traité comme une true valeur.

D'autre part, if [[ expr ]] avec des crochets doubles est un motkey spécifique à bash qui peut gérer son propre set d'options, comme -f /path/to/file pour tester l'existence du file, ou même gérer la variable tests tels que $a == $b . Dans ces parenthèses, vous devez explicitement lui dire d'évaluer une expression comme un set de commands bash avec if [[ $(cmds) ]] . Sinon, il traitera n'importe quoi là-bas comme une expression spéciale et sera analysé différemment.

Il y a aussi la construction if [ expr ] , qui est généralement un alias (ou, dans certains cas, une implémentation approximative de) if test expr . Si la command de test dispose d'une option disponible, vous pouvez également l'utiliser entre parenthèses.

Pour plus de plaisir, il y a la construction if ((expr)) , ce qui est la meilleure lorsqu'il s'agit de nombres, puisque tout ce qui se trouve à l'intérieur est évalué comme une expression arithmétique. C'est aussi un mot-key, comme les doubles crochets.

En gros, if expr et if [ expr ] sont portables (c'est-à-dire que tous les shells peuvent les gérer et les gérer de manière identique) et if [[ expr ]] et if (( expr )) sont spécifiques à l'implémentation, l'évaluation dépend fortement du shell dans lequel vous les utilisez (et si vous n'utilisez pas quelque chose comme bash , zsh ou ksh , ils n'existent même pas).