Ce ne serait pas bien si 'test' avait une option pour sortir une valeur immédiatement? Juste l'option. C'est tout ce dont nous aurions besoin.
Todd Walton
Réponses:
15
Vous obtenez 0 ou 1. Dans le code de sortie.
bash-4.2$ test 4-lt 6
bash-4.2$ echo $?0
bash-4.2$ test 4-gt 6
bash-4.2$ echo $?1
Mise à jour : pour stocker le code de sortie pour une utilisation ultérieure, affectez-le simplement à une variable:
bash-4.2$ test 4-lt 6
bash-4.2$ first=$?
bash-4.2$ test 4-gt 6
bash-4.2$ second=$?
bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1
existe-t-il un moyen de diriger le code de sortie?
indieman
3
Non. Seule la sortie peut être redirigée. Quoi qu'il en soit, cela n'est généralement pas nécessaire. Pour le stocker pour une utilisation ultérieure, affectez-le simplement à une variable. Ou dites-nous quelle est exactement votre intention avec cette valeur.
manatwork
2
Le code de sortie est placé dans la $?variable - au moins jusqu'à ce qu'il soit remplacé par la prochaine commande que vous exécutez.
Shadur
1
PS: vous pouvez utiliser le $PIPESTATUStableau pour obtenir le résultat de plusieurs commandes dans un pipeline. $?sera par conséquent le résultat de la dernière commande du pipeline si l' pipefailoption est désactivée (par défaut).
l0b0
@indieman, si ce dont vous avez besoin est de faire autre chose en fonction du statut de sortie, vous n'avez même pas besoin de l'enregistrerif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard
5
Une autre façon est
test 4-lt 6&& echo 1|| echo 0
Mais soyez prudent dans ce cas. Si testrenvoie, le succès et l' echo 1échec echo 0seront exécutés.
Si vous voulez le résultat d'une comparaison sur la sortie standard au lieu d'un code de sortie, vous pouvez utiliser la expr(1)commande:
$ expr 4'<='61
Deux choses à noter:
vous devrez probablement citer l'opérateur car beaucoup d'entre eux entrent en conflit avec les métacaractères du shell
la valeur de sortie est l'opposé du code retour pour test. testrenvoie 0 pour vrai (qui est la norme pour les codes de sortie), mais exprimprime 1 pour vrai.
3. Il y a un testshell intégré, qui est considérablement plus rapide (environ 50 fois sur ma machine) que les exécutables testet exprdu package coreutils .
manatwork
+1 pour le deuxième point. Pourrait obtenir un bogue très frustrant à trouver si vous vous trompez.
Réponses:
Vous obtenez 0 ou 1. Dans le code de sortie.
Mise à jour : pour stocker le code de sortie pour une utilisation ultérieure, affectez-le simplement à une variable:
la source
$?
variable - au moins jusqu'à ce qu'il soit remplacé par la prochaine commande que vous exécutez.$PIPESTATUS
tableau pour obtenir le résultat de plusieurs commandes dans un pipeline.$?
sera par conséquent le résultat de la dernière commande du pipeline si l'pipefail
option est désactivée (par défaut).if test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Une autre façon est
Mais soyez prudent dans ce cas. Si
test
renvoie, le succès et l'echo 1
échececho 0
seront exécutés.la source
Si vous voulez le résultat d'une comparaison sur la sortie standard au lieu d'un code de sortie, vous pouvez utiliser la
expr(1)
commande:Deux choses à noter:
test
.test
renvoie 0 pour vrai (qui est la norme pour les codes de sortie), maisexpr
imprime 1 pour vrai.la source
test
shell intégré, qui est considérablement plus rapide (environ 50 fois sur ma machine) que les exécutablestest
etexpr
du package coreutils .Vous pouvez taper la commande suivante:
la source