Bourne: si l'état de sortie d'essai de déclaration
-
01-10-2019 - |
Question
Quelle est la différence:
if IsServerStarted ; then ...
et
if [ IsServerStarted -eq 0 ] ; then ...
me semble que ces deux déclarations doivent être équivalentes? Étrangement la deuxième déclaration est toujours vrai.
La solution
Ce qui suit exécute la fonction d'enveloppe ou exécutable dans $PATH
nommé IsServerStarted
, et si son code de sortie est 0
(à savoir true), exécute la branche then
. Si une telle fonction ou exécutable n'existe pas, le code de sortie sera non-0
(à savoir faux) et la branche then
est sautée.
if IsServerStarted ; then ...
Ce qui suit a [
(alias test
) vérifier si IsServerStarted
est un nombre entier égal à 0
, qui (IsServerStarted
même pas contenant un seul chiffre) est toujours false . Ainsi, les sorties de [
avec un code non-0
(à savoir faux) et la branche then
est toujours sautées.
if [ IsServerStarted -eq 0 ] ; then ...
Autres conseils
En fait, le second donnera une erreur se plaignant que « IsServerStarted » n'est pas un entier valide. Il est considéré comme une constante de chaîne pour quelque chose comme
var="IsServerStarted"
if [ IsServerStarted == "$var" ] ; then
réussirait (ou l'échec si elle n'a pas été égal).
ndim est correct en ce qui concerne l'exécutable ou une fonction dans le premier exemple que vous avez donné.
Un couple plus de variations à considérer:
if $IsServerStarted ; then ...
Dans celle-ci, la if
est évaluée sur la base de la valeur de retour d'une commande (exécutable ou une fonction) qui est contenue dans la IsServerStarted
variable. Donc, vous pouvez définir IsServerStarted=true
et la if
réussiriez depuis true
est une SHELL qui retourne toujours vrai. Vous pouvez définir IsServerStarted='grep popsicle freezer' and the
if` passerait ou ne selon que vous étiez hors de friandises.
if [ $IsServerStarted -eq 0 ]; then ...
Ce test simplement si la variable est égale à zéro. Si ce n'est pas un entier valide, il provoque un message d'erreur.