La commande de test sous Unix n'imprime pas de sortie

20

Quand je tape ceci dans le terminal

test 4 -lt 6

Je ne reçois aucune sortie. Pourquoi pas? J'ai besoin de 0 ou 1

indieman
la source
1
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
homme au travail
la source
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.

se ruer
la source
2

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 '<=' 6
1

Deux choses à noter:

  1. vous devrez probablement citer l'opérateur car beaucoup d'entre eux entrent en conflit avec les métacaractères du shell
  2. 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.
camh
la source
1
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.
Emanuel Berg
2

Vous pouvez taper la commande suivante:

echo $(test -e myFile.txt) $?
MCH
la source