2010-10-13 7 views
7

Dans script bashComment le mot-clé «if» teste si une valeur est vraie de false?

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

Sortie: Yes

Il représente qui est considérée comme valeur true '1'.

Mais dans le code:

word = Linux 
letter = nuxi 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

Sortie: Non

Mais echo "$word" | grep -q "$letter" renverra 1, pourquoi le résultat est n °

comment le mot-clé if test, la valeur retournée par la commande après if?

+0

Vous trouverez peut-être [ma réponse ici] (http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var/3870055 # 3870055) pour être utile. –

Répondre

8

La valeur de retour d'une commande est vérifiée. [ 1 ] a une valeur de retour de 0 (true). Toute autre valeur de retour (comme 1) indique une erreur.

Vous pouvez afficher la valeur de retour de la dernière commande exécutée en utilisant la variable $?:

true 
echo $? 
# returned 0 
false 
echo $? 
# returned 1 
echo $? 
# returned 0 as the last executed command is 'echo', and not 'false' 
+0

Ah, est-ce parce que '[' est un shell intégré, il retournera 0 quand il terminera la fonction de test? –

+0

Il semble que '0' est une expression qui vaut 'true'. '[0 = 1]' a une valeur de retour de '1' (valeur attendue) et' [0 = 0] 'a une valeur de retour de' 0'. Exécutez 'man test' pour plus d'informations sur' test' ('' '' '' '' '' '' '' '' '' '' – Lekensteyn

+3

'[1]' ou '[0]' évalue à vrai parce que 'test' /' ['avec un seul paramètre vérifie simplement si la chaîne de paramètre (ici '1' ou' 0') est non-vide.iow '[" "]' serait faux. – Dummy00001

0

En effet, le grep n'a pas réussi à trouver la lettre de $ dans le mot de $, d'où le code de sortie est 1. Chaque fois que un processus dans linux retourne un code autre que 0 alors cela signifie qu'il a échoué. 0 signifie terminé avec succès. Vous pouvez vérifier cela par echo "Linux" | grep -d "nuxi"; echo $?

D'autre part dans le monde de script 0 signifie faux et 1 signifie vrai. Donc, le grep n'a pas réussi à trouver le mot et a envoyé 1 comme code de sortie à if, qui l'a pris comme une vraie valeur.

7

En zone unix, 0 est vrai et 1 est faux.

Pour votre premier exemple:

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

« Si » vérifie le code de sortie de la commande donnée pour vrai/faux (à savoir zéro/non nul).

Les crochets invoquent réellement la commande "test" (voir "man test" pour plus d'informations) et donnent le code de sortie à if. "Test 1" (ou en effet "test any_string") renvoie true (0), donc "Yes" est sorti. Pour votre second exemple, ceci affiche "Non" car "nuxi" ne se trouve pas dans "Linux", si vous changez "nuxi" en "nux" (peut-être c'était une faute de frappe?) Et supprimez les espaces autour le = alors vous obtiendrez le comportement que vous attendez. par exemple.

word=Linux 
letter=nux 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi