|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
Je créé ce sujet car je n'ai rien trouvé d'équivalent sur ce site.
J'ai une toute jeune expérience du bash mais j'ai déjà rencontré un de ces pièges. Bash ne supporte pas les if (elif inclus) et fonctions vides, il y faut au moins une instruction. Code :
Aucun, sauf si on veut simplement faire le prototype et avancer plus loin dans une autre partie du code, pour y revenir ultérieurement. Après on peut discuter du bien fondé d'une telle démarche, mais c'est un autre débat ![]() Bref, pour pallier à cela il suffit d'ajouter une instruction qui ne modifie pas le déroulement du code, true ou false semble tout indiqué dans la plupart des cas. Je précise que je n'ai trouvé aucune info à ce sujet dans le man de bash, et ça me semble tout sauf évident, j'ai jamais rencontré cela dans un autre langage script, personnellement j'ai perdu un temps fou à trouver cette cause, je pensais à tout sauf à cela. Si vous pouviez faire part d'éventuelles autres infos de ce genre ici (si il y en a) J'ai hésité à poster dans le sujet "truc et astuces", mais je trouvais que le sujet était différent, si le staff décide que ce n'est pas le cas, alors amen. |
||
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
|
|
10
|
|
|
#3 | |||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Le principal problème du shell, c'est qu'il est très lent. Normal puisqu'il analyse chaque instruction. Et donc pour qu'il soit malgré tout le plus rapide possible, son moteur d'analyse a été réduit au minimum. Corollaire, un moteur d'analyse réduit n'est pas cablé pour analyser toutes les situations possibles. Ce qui implique alors une syntaxe parfaite de la part du programmeur car sinon l'analyseur ne pigera rien. Donc après un if, il faut un then et une instruction. Après un while et un for, il faut un do et une instruction. D'où ta solution d'utiliser l'instruction "true" ne faisant rien de visible. Tu aurais pu aussi mettre un simple point-virgule symbolisant l'instruction "rien" Autre danger du shell que j'ai déjà repéré mais qui peut causer souci à celui qui n'est pas habitué Code bash :
Le danger de ce code vient si l'utilisateur tape "<return>" dans rien répondre. A ce moment là, la variable $rep est vide et le shell voit Cette syntaxe est bancale car l'opérateur "=" veut absolument deux opérandes et ici il n'en voit qu'un seul. D'où le message sybillin "test:= unary opérator expected" signifiant qu'il s'attend à avoir un opérateur unaire en lieu et place du "=" vu qu'il ne voit qu'un seul opérande. Pour pallier ce danger, toujours encapsuler les variables chaines par des guillemets Code bash :
Si jamais la variable $rep" est vide, le shell verra Et là, il comprendra quand-même qu'il doit comparer 2 chaines...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||||
|
|
20
|
|
|
#4 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
@FRUIT : Merci pour le lien, je m'étais limité à quelles sources francophones, mais je dois dire que celle là à l'air d'être d'une meilleure qualité.
@Sve@r : : J'avais essayé une instruction vide ; mais bash me vomissait une erreur de syntaxe, as tu vraiment essayé cette solution ? Merci pour le warning, même si je le savais déjà (je ne peux pas non plus être complètement ignorant |
|
|
00
|
|
|
#5 | |||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Mais puisqu'on est dans les petites subtilités du shell (je viens de lire http://mywiki.wooledge.org/BashPitfalls que j'ai trouvé pas mal du tout), j'ai remarqué un truc amusant sur les booléens En effet, dans les langages classiques, un booléen n'est jamais examiné plus que nécessaire. Par exemple dans un if (e1 or e2 or e3), si e1 est vrai, alors l'évaluation ne s'embête pas à examiner e2 et e3 puisque le test est de toute façon vrai. Pareil pour un "et" qui serait faux dès la première expression. Ce qui est pratique quand l'évaluation de e2 dépend de e1 comme les pointeurs en C Mais pas en shell, comme le démontre le petit code suivant Code :
Et idem dans le cas du "et" où le fichier n° 2 est inutilement créé alors que le "if" est déjà définitivement faux...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
Ok, rien de bien important à priori mais cela met la valeur $? à 0, dans certains cas l'emploi de false à la place peut donc être utile.
Mais dans la mesure où l'on parle d'un code qui n'est pas fini ... EDIT : Cela s'applique aussi pour les conditions liées par des && ou des || J'avais mal lu ![]() Même si cette dernière forme [[ expression ]] n'est pas compatible avec le sh (mais l'est pour bash et ksh, et surement d'autres shell), elle est plus puissante. Plus d'explications dans cette page. (j'étais justement en train de la lire Le problème vient quand on a plus de 2 tests ainsi en série, dès fois le comportement du shell n'a pas vraiment de sens
|
|
|
00
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Là ce n'est plus pareil. Le && et || sont des connecteurs d'instructions. e1 && e2 n'ira exécuter e2 que si e1 est vrai. Normal que si e1 soit faux, e2 ne soit pas exécuté Moi je parlais de l'évaluation interne faite par l'instruction "test" laquelle aurait-pu être un poil plus poussée (simplifiée peut-être ?)... Arf non, le Bourne Shell de base connait parfaitement les "&&" et "||" Je ne sais pas. Je ne suis pas certain qu'il soit judicieux de remplacer un qui n'appelle qu'une fois l'instruction; en qui l'appellera 2 fois...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
00
|
|
|
#8 | |||||||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
|
|||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com