[La commande retourne l'état de sortie zéro si expression, contenue dans ses arguments, est considérée comme vraie et non nulle comme état de sortie si expression, contenue dans ses arguments, est considérée comme fausse. Il échoue également avec le message d'erreur si son dernier argument n'est pas ](ceci est fait uniquement pour des raisons esthétiques).
Par exemple:
[ hello ]
echo "Exit-status of [ hello ] is:" $?
[ abc = abc ]
echo "Exit-status of [ abc = abc ] is:" $?
[ ]
echo "Exit-status of [ ] is:" $?
[ abc = def ]
echo "Exit-status of [ abc = def ] is:" $?
… Produira:
Le statut de sortie de [hello] est: 0 - car la chaîne non vide est considérée comme vraie
. Le statut de sortie de [abc = abc] est: 0 - car 'abc' est vraiment identique à 'abc' Le
statut de sortie de [] est : 1 - car la chaîne vide est considérée comme fausse
. Le statut de sortie de [abc = def] est: 1 - parce que 'abc' diffère vraiment de 'def'
Cependant, bash et de nombreux autres shells n'appellent généralement pas /bin/[(ou /usr/bin/[) dans ces cas-là, mais appellent une commande intégrée avec exactement le même comportement (uniquement pour des raisons de performances). Pour appeler /bin/[(et non le substitut intégré au shell), vous devez spécifier explicitement son chemin (par exemple /bin/[ hello ], vous n'avez pas besoin de préfixer ]avec dirname si ☺ ), ou configurer le shell pour ne pas utiliser un substitut intégré (par exemple, enable -n [en bash).
PS: Comme cela a été dit dans d'autres réponses, [est lié à test. Mais test, contrairement à [, ne nécessite pas ]le dernier argument (et ne l'attend pas du tout; l'ajout ]d' testarguments supplémentaires peut entraîner l'échec du message d'erreur ou le renvoi d'un résultat erroné) . Le /bin/testet /bin/[peut résoudre le même fichier (par exemple , un est un lien symbolique , dans ce cas , le détournement de comportement est probablement mis en œuvre par l' analyse de la commande actuellement appelée dans le test/ [code lui - même) ou des fichiers différents. En testoutre, shell appelle généralement le substitut intégré, sauf si path est explicitement spécifié ( /bin/test) ou s'il est configuré pour ne pas le faire (enable -n test)
PPS: Contrairement à testand [, modern ifn’est jamais un vrai fichier. Cela fait partie de shell (par exemple bash) syntaxe: if commandA; then commandB; fi(sauts de ligne peuvent être utilisés à la place des points - virgules) provoque commandBà exécuter si et seulement si vous êtes commandAliquide' zéro état. Cela correspond parfaitement au comportement de testou [, permettant de les combiner comme if [ "$a" = foo ]; then …; fi (ou if test "$a" = foo; then …; fi- tout simplement moins lisibles) . Cependant, les scripts modernes utilisent souvent à la [[place de testou [, qui (en tant que if) n'est jamais un fichier réel, mais fait toujours partie de la syntaxe du shell.
PPPS: En ce qui concerne man- ne vous attendez jamais manà avoir un article sur chaque commande de votre système de fichiers. Infos sur certaines commandes (même « réel », basé sur des fichiers) peuvent être manquants, informations sur certains shell Encastrements peut - être présent non seulement dans un article consacré à l' enveloppe spécifique (qui est l'endroit où vous certainement y trouver des informations sur test, [, if, [[). Pourtant, beaucoup de distributions ont des manarticles explicites pour testet [. (À propos --help, ce n'est pas reconnu testpour une raison évidente: il doit gérer des cas comme par exemple a=--help; test "$a": sur certaines distributions [ --help(sans fermer ]), l'aide est toujours affichée, sur d'autres non.)
[fait référence à latestcommande si, nonexpr, il devrait donc êtreman test