Que signifient les crochets sans le “ if ” à gauche? [dupliquer]

Cette question a déjà des réponses ici :

Commentaires

  • Pas un doublon. Lautre question concerne linstruction if. Cette question demande ce que signifient les crochets sans une instruction if.

Réponse

Les crochets sont une notation abrégée pour effectuer un test conditionnel. Les crochets [, ainsi que [[ sont des commandes réelles sous Unix, croyez-le ou non.

Pensez:

$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file 

Dans Bash, le [ est une commande intégrée ainsi quun exécutable. [[ est juste un mot-clé pour Bash.

Exemple

Vous pouvez le confirmer en utilisant type:

$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword 

Vous pouvez voir lexécutable physique ici:

$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[ 

builtins vs . keywords

Si vous jetez un œil à la page de manuel de Bash, man bash, vous « trouverez les définitions suivantes pour les 2:

  • mots-clés – Les mots réservés sont des mots qui ont une signification particulière pour le shell. Les mots suivants sont reconnu comme réservé lorsquil nest pas entre guillemets et soit le premier mot dune simple commande (voir SHELL GRAMMAR ci-dessous) soit le troisième mot dune casse ou pour la commande:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • builtins – Si le nom de la commande ne contient pas de barres obliques, le shell tente de le localiser. Sil y a existe une fonction shell portant ce nom, cette fonction est appelée comme décrit ci-dessus dans F ONCTIONS. Si le nom ne correspond pas à une fonction, le shell la recherche dans la liste des fonctions internes du shell. Si une correspondance est trouvée, cette fonction intégrée est invoquée.

    Si le nom nest ni une fonction shell ni une fonction intégrée et ne contient pas de barres obliques, bash recherche dans chaque élément du PATH un répertoire contenant un fichier exécutable par ce nom. Bash utilise une table de hachage pour se souvenir des chemins complets des fichiers exécutables (voir hachage sous COMMANDES DE SHELL BUILTIN ci-dessous). Une recherche complète des répertoires dans PATH est effectuée uniquement si la commande nest pas trouvée dans la table de hachage. Si la recherche échoue, le shell recherche une fonction shell définie nommée command_not_found_handle. Si cette fonction existe, elle est appelée avec la commande dorigine et les arguments de la commande dorigine comme arguments, et létat de sortie de la fonction devient létat de sortie du shell. Si cette fonction nest pas définie, le shell imprime un message derreur et renvoie un état de sortie de 127.

page de manuel

Si vous parcourez la Page de manuel de Bash, vous en trouverez les détails.

test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options. 

Enfin, à partir de la page de manuel:

 test and [ evaluate conditional expressions using a set of rules based on the number of arguments. 

EDIT # 1

Question complémentaire du PO.

Ok, alors pourquoi y a-t-il un besoin dun « si » alors? Je veux dire, pourquoi « si » existe même si « [ » suffirait.

Le if fait partie dun conditionnel. La commande test ou la commande [ ... ] évalue simplement le conditionnel et renvoie un 0 ou a 1. Le 0 ou 1 est ensuite actionné par linstruction if. Les 2 fonctionnent ensemble lorsque vous les utilisez.

Exemple

if [ ... ]; then ... do this ... else ... do that ... fi 

Commentaires

  • Ok, alors pourquoi est-il nécessaire davoir un " si " alors? moi moi an, pourquoi " si " existe même si " [" suffirait.
  • Petit truc: [[ peut aussi être un shell intégré.
  • @supertonsky – ils fonctionnent mais ils ne renvoient que le statut du test, ils peuvent ' t agir sur celui-ci de quelque manière que ce soit. Le if agit comme un interrupteur et exécute les commandes du bloc then ou non en fonction des résultats renvoyés par le conditionnel. if nest ' t vraiment facultatif de la façon dont vous ' pensez, les exemples que nous a montré utiliser && qui est un peu comme le if. Si la condition échoue, alors la commande après && aren ' sexécute.
  • @SteveKoch – comme je comprenez-le, le ] est un argument dans ce contexte à la commande [.Je ' d suppose quil y en a, mais je ne peux ' penser à rien du haut de ma tête. Cela vaudra peut-être la peine de le publier comme une autre question si vous ' êtes vraiment curieux.
  • @SteveKoch – dailleurs, /usr/bin/[ montre comme faisant partie des coreutils sur mon système Fedora. Vous pouvez toujours consulter la source sur ces questions si vous voulez savoir exactement comment de telles choses fonctionnent. git.savannah.gnu.org/cgit/coreutils.git

Réponse

Ooohh, un de mes sujets préférés !!

Les crochets sont un synonyme de la commande « test ». Si vous lisez la page de manuel de test, vous « verrez que vous pouvez invoquer la commande de test soit

test -r /etc/profile.d/java.sh 

ou

[ -r /etc/profile.d/java.sh ] 

Les espaces entre les crochets et les éléments à lintérieur et à lextérieur sont obligatoires.

La commande » test « dans ce cas vérifie si le fichier / etc / profile.d / java.sh est lisible par lutilisateur actuel. Cela implique une vérification pour voir sil existe, bien sûr. 🙂

Le && est un raccourci de syntaxe bash pour « si la commande sur la gauche réussit, alors exécutez la commande sur la droite. Donc, cette commande composée est un raccourci pour un « si-alors » qui ressemblerait à ceci:

if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi 

Maintenant, vous trouverez également des doubles crochets expliquées dans la page de manuel bash. Il sagit dune version interne bash dune fonction de test étendue. Sachez que ce ne sont pas exactement les mêmes. Il y a des choses que vous pouvez faire avec celles que vous ne pouvez pas faire avec la commande « test » et son  » [« synonyme.

Commentaires

  • Je veux juste massurer de bien comprendre. Si les crochets sont un alias pour " test ", ne devrait ' que votre deuxième exemple soit " [- r /etc/profile.d/java.sh] "? En dautres termes, supprimez linstruction de test redondante.
  • Oui, pmont, vous ' vous avez tout à fait raison, bien sûr! Je nai ' pas fait attention lorsque jai coupé et collé. Je ' Je lai corrigé. Merci!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *