Question

Beaucoup de code sh ressemble à:

$cmd
if [ $? = 0 ]; then $cmd2; fi

Au lieu de:

if $cmd; then $cmd2; fi

Je suppose généralement que les gens utilisent l'ancien simplement parce qu'ils ne savent pas que la syntaxe de cette dernière est valide, mais je me demande s'il y a une autre raison (bien que la seule possibilité qui vient à l'esprit est la portabilité). Y at-il raison de préférer explicitement référence $ {?}?.

Était-ce utile?

La solution

Vous devez faire référence $? si vous voulez utiliser le code d'erreur pour quelque chose (l'exploitation forestière, la gestion des erreurs attendues, etc.). Pour le scénario particulier que vous mentionnez, la deuxième construction if est à la fois plus claire et plus courte, et je ne vois aucune raison de ne pas l'utiliser.

Autres conseils

À mon avis, parce que beaucoup de gens ne réalisent pas que vous pouvez tester l'état de la commande plus ou moins comme vous le faites. De même, les gens ne réalisent pas que vous pouvez écrire:

if cmd1
   cmd2
   cmd3
then
    ...do this after executing cmd1, cmd2 and cmd3, but ...
    ...only if cmd3 exits with with status 0!
fi

Vous pouvez également simplifier votre code (au prix de laconisme) à:

cmd1 && cmd2

(je vois @shin pris acte dans un commentaire que j'ai mis voté).

Je vois aussi beaucoup de code shell 'Bourne' qui utilise:

if ( ... )
then ...
fi

Parfois, cela est approprié - mais le plus souvent il est une chose qu'un shell C programmeur a écrit ne réalisant pas que la notation signifie « exécuter un sous-shell » dans Bourne shell et ses dérivés - tels que Korn shell, les coquilles conforme au standard POSIX, et Bash.

Parce que vous testez l'indicateur d'état de la commande, par opposition à tester la sortie de la commande.

Si une commande imprime sur la sortie standard, mais définit un drapeau, vous obtiendrez obtenir des résultats différents avec les deux exemples que vous avez donné.

Je me corrige, après l'avoir testé. Je pensais que je me suis souvenu en cours d'exécution dans un problème il y a quelques années sur solaris, mais je ne peux pas recréer sous les machines que j'ai actuellement accès à l'exception des tests (sous ksh?):

si [$cmd]

Oui beaucoup de gens ne connaissent pas cette dernière forme plus élégante. Je l'ai déjà mentionné cela dans: http://www.pixelbeat.org/programming/shell_script_mistakes.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top