J'ai lu que le point-virgule est utilisé pour séparer les programmes:
$ echo 3; ls -la
Est-ce que cela signifie cela if
, then
et else
y a- t-il des programmes distincts ici?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
Cette question ne concerne pas les points-virgules.
bash
shell-script
shell
Maxim Koretskyi
la source
la source
[ $variable == abcdef ] && echo yes || echo no
Réponses:
Les
;
déclarations séparées (en gros). Il est (presque) toujours possible de remplacer a;
par une nouvelle ligne.Dire que
;
sépare deux programmes, doncif
etthen
doit être "programmes" est un peu trop simpliste car une déclaration peut être faite de mots réservés, de fonctions shell, d'utilitaires intégrés et d'utilitaires externes, et de combinaisons de ceux-ci en utilisant des tuyaux et des opérateurs booléens, etc. . etc.Les deux
if
etthen
sont des mots réservés dans la grammaire du shell , pas des "programmes". Ici, ils sont utilisés pour créer ce que l'on appelle techniquement une commande composée .echo
est probablement un utilitaire intégré dans le shell (mais ne doit pas l'être), etls
est probablement un utilitaire externe (ou "programme" comme vous le dites).la source
Bien que ce soit une première approximation juste quand on commence à apprendre les bases de l'utilisation des shells, au niveau de "voici comment on exécute un programme" et "voici comment on exécute plusieurs programmes les uns après les autres sur une seule ligne" , ce n'est pas vraiment vrai.
Le plus difficile à comprendre pour un débutant mais une explication plus correcte est que le langage shell est un langage informatique . Il a une syntaxe . Cette syntaxe comprend divers éléments lexicaux, y compris (entre autres) des sauts de ligne, des opérateurs, des mots et des mots réservés.
if
,then
,else
Etfi
sont tous des mots réservés . Ils ont des significations particulières lors de l' analyse de l'entrée que l'on donne à un shell, selon sa grammaire . De même,;
est un opérateur séparateur .L'entrée en langage shell est donc, prise dans son ensemble, un programme informatique qui est interprété par un autre programme, un interprète , le shell. Ses parties grammaticales individuelles ne sont pas des programmes. Le langage shell est un moyen de spécifier (d'autres) programmes à exécuter par le shell.
[
n'est pas un élément lexical spécial dans la grammaire du shell tel qu'un opérateur. C'est un mot ordinaire , qui nomme un tel programme nommé[
. De nombreux shells ont une version intégrée de ce programme, combinée dans le code du programme shell lui-même, mais vous pouvez également trouver un programme externe de ce nom quelque part comme/bin/[
ou/usr/bin/[
, que d' autres programmes que les shells peuvent invoquer. De même, ce]
n'est pas non plus un élément lexical shell spécial. C'est un mot ordinaire, qui devient un argument pour le[
programme. Le[
programme requiert que son argument final, lors de son exécution, soit]
, qu'il procède ensuite à ignorer.Un autre programme similaire nommé dans votre question est
echo
. Encore une fois, la plupart des shells ont une version intégrée de ce programme. Mais encore une fois, il existe également une version externe du programme, quelque part comme/bin/echo
ou/usr/bin/echo
, pour les programmes autres que les shells à invoquer.Un troisième programme nommé dans votre question est
ls
. Les shells n'ont généralement pas de versions intégrées de ce programme, et il s'agit d'un programme externe, à trouver quelque part comme/bin/ls
ou/usr/bin/ls
.Pour le shell Bourne Again, vous pouvez en savoir plus à ce sujet dans la section Basic Shell Features of the GNU Bourne Again shell info documentation. D'autres coquilles ont naturellement des grammaires différentes. La spécification Unix unique décrit une syntaxe à laquelle tous les shells conformes POSIX (dans leurs modes conformes POSIX) sont censés adhérer.
Lectures complémentaires
test
. Utilitaires . Spécifications de base Problème 7. Le groupe ouvert. IEEE 1003.1-2008. ISBN 1937218812.la source
Il est en fait pas exagéré de penser
if
,then
etelse
que des programmes externes. En fait, le shell Thompson dans la 1ère édition originale Unix implémentéif
et engoto
tant que programmes externes. Cela est possible car le sous-processus partage les descripteurs de fichier avec le processus shell, donc un goto (avant) n'a eu qu'à lire l'entrée jusqu'à ce qu'il trouve l'étiquette cible puis se ferme. Voir coque Thompson .la source
if
etifelse
qui font partie deexecline
. Ce ne sont pas lesif
dans la question, cependant.Les
then
etelse
ne sont pas des programmes. Les autres parties le sont. Remarquez qu'il n'y a pas;
directement après eux, mais après la commande, ils précèdent.La
[ ... ]
est une commande et a besoin du;
si suivi du début d'une autre commande.AFAIK, toutes les structures de contrôle dans Bash, et probablement la plupart des shells * nix, sont les mêmes. Ce sont des instructions à l'interprète. Le test ou la condition, d'autre part, utilise un programme / processus qui est "exécuté" et sont des commandes. Puisque
then
fait partie de la ligne qui mène à laecho
commande, elle doit être séparée par une nouvelle ligne de la commande précédente[ ... ]
. Il n'a pas besoin d'être séparé de la commande qu'il contrôle, laecho yes
.Légalement, bien que laid et difficile à lire, vous pouvez également le faire.
Notez qu'il n'y a aucun besoin
;
entre les contrôles ici, même s'ils ne sont pas sur leur propre ligne.Chose intéressante, toute la structure de contrôle (
if ... fi
) est une commande shell, et l'intégralité doit se terminer par une nouvelle ligne ou un;
. La dernière ligne ne peut pas êtrefi echo done
mais doit l'êtrefi; echo done
. La même chose qu'une affectationVARIABLE='abcdef'
est une commande.Même si l'ensemble des structures de contrôle sont des commandes, elles ne sont toujours pas des programmes.
la source
if
,elif
,then
, Etfi
sont tous les mots clés réservés utilisés pour mettre en œuvre l' une des constructions appelé une commande composée en coquille, ce qui signifie qu'il ne peut y avoir une commande (ou plutôt, une autre commande) par l' un de ces noms en coquille. En;
général, le but n'est pas de séparer les commandes, mais de terminer une liste de commandes . Par exemple, ce qui suit est uneif
déclaration valide :La condition de l'
if
instruction est la liste des commandesecho foo; echo bar; echo baz
. L'analyseur sait que la condition est terminée carthen
, qui suit immédiatement un point-virgule, ne peut pas être une commande car il s'agit d'un mot clé réservé. Ainsi, il sait que ce qui suitthen
est le début du corps. De même,fi
est un mot clé réservé et ne peut donc pas être une troisième commande dans le corps de l'if
instruction, mais marque la fin de la commande composée.la source
if program1 foo; program2 bar; program3 baz;
, quel statut de programme devrait être0
, pour que le shell continuethen
? Le dernier?program3 baz
. L'état de sortie d'une liste de commandes est l'état de sortie de la dernière commande de cette liste. Les deux autres peuvent échouer sans affecter la condition.