1. Résumé
Je ne comprends pas, pourquoi ai-je besoin de la règle basate E010 .
2. Détails
J'utilise bashate pour peloter les.sh
fichiers. Règle E010:
ne pas sur la même ligne que pour
for
bashate:
Correct:
#!/bin/bash for f in bash/*.sh; do sashacommand "$f" done
Erreur:
#!/bin/bash for f in bash/*.sh do sashacommand "$f" done
Y a-t-il des arguments valides, pourquoi ai-je besoin for
et do
dans la même ligne?
3. Inutile
Je ne trouve pas de réponse à ma question dans:
- Articles sur les meilleures pratiques de codage ( exemple )
documentation bashate . Je ne trouve que :
Un ensemble de règles qui aident à garder les choses cohérentes dans les blocs de contrôle. Celles-ci sont ignorées sur les longues files qui ont une suite, car dérouler c'est un peu «intéressant»
bash
shell-script
Саша Черных
la source
la source
do
est certainement un peu inhabituel, mais ilfor ... \ndo\n<indent>body...
est extrêmement courant et je l'estimerais même plusfor ... ; do
. Se plaint-il également de cela?bashate
est un vérificateur de style . Les styles sont intrinsèquement subjectifs. Ne l'utilisez pas si vous n'aimez pas le style d'artibrary qu'il impose. Vous devriez plutôt envisager un vérificateur de syntaxe / bogue comme shellcheck .E010
- que le style règle ou dans certains cas , j'ai besoin pour et fais dans la même ligne , non seulement par des raisons de style.do
. Il est comme l'accolade indenter ouverture d'unif
et en ajoutant le code sur la même ligne dans une langue comme C. Un autre exemple, si python lui a permis, serait mettre la:
d'unif
retrait sur la ligne suivante et en ajoutant le code sur cette même ligne. Cela va le faire différer avec des lignes supplémentaires dans le corps.Réponses:
Syntaxiquement, les deux extraits de code suivants sont corrects et équivalents:
On pourrait peut- être dire que ce dernier est plus difficile à lire car il
do
obscurcit légèrement la commande dans le corps de la boucle. Si la boucle contient plusieurs commandes et que la commande suivante se trouve sur une nouvelle ligne, l'obscurcissement serait davantage mis en évidence:... mais le signaler comme une "erreur" est l'opinion personnelle de quelqu'un à mon humble avis plutôt qu'une vérité objective.
En général, presque tous
;
peuvent être remplacés par une nouvelle ligne. Les deux;
et newline sont des terminateurs de commande.do
est un mot-clé qui signifie "voici ce qui doit être fait (dans cettefor
boucle)".est le même que
et comme
La raison d'utiliser l'un sur l'autre est la lisibilité et les conventions de style local / personnel.
Opinion personnelle:
Dans les en-têtes de boucle qui sont très longs , je pense qu'il peut être judicieux de mettre
do
une nouvelle ligne, comme dansou
Il en va de même pour le
then
dans uneif
déclaration.Mais encore une fois, cela se résume aux préférences de style personnel ou au style de codage utilisé par l'équipe / le projet.
la source
do
, je ne vois pas pourquoi le mettre sur la ligne suivante aiderait la lisibilité.do
(outhen
) sur une ligne seule (comme dans l'avant-dernier exemple). Tout cela dépend des préférences personnelles. Je n'aime pas les lignes trop longues, en partie parce que mon terminal ne fait "que" 80 caractères de large, et en partie parce que je pense qu'il semble désordonné. J'ai également du mal à analyser les très longues lignes pour les erreurs.do
sur une ligne séparée une "erreur". Ce sont plutôt des phrases strictes, il ne semble la peine de souligner que, bien au contraire, le soi-disant « règle » est en fait juste une opinion subjective.Notez ce qu'il dit en haut de la page:
PEP8 est le guide de style pour le code Python. Alors que les gens de Python semblent souvent prendre très au sérieux leurs problèmes de style [citation nécessaire] , c'est juste cela, un guide. Nous pourrions trouver des avantages à la fois pour mettre le
do
dans la même ligne que lefor
, et pour le mettre sur une ligne qui lui est propre.C'est la même discussion où mettre le
{
dans le code C lors du démarrage d' unif
ouwhile
bloc (ou tel).Quelques lignes plus bas dans la documentation, il y a une autre règle intéressante:
Je suppose que le point ici est que l'auteur de ce guide de style pense que l'utilisation du
function
mot-clé est nécessaire pour que le lecteur reconnaisse une déclaration de fonction. Cependant,function foo
est une façon non standard de définir une fonction: la manière standard estfoo()
. La seule différence entre les deux (dans Bash) est que l'autre est plus difficile à porter sur un shell standard, comme/bin/sh
dans Debian ou Ubuntu.Donc, je suggère de prendre n'importe lequel de ces guides de style avec un grain de sel ou trois, et de décider par vous-même quel est le meilleur style. Un bon vérificateur de style permet de désactiver certaines vérifications (bashate doit
bashate -i E010,E011
ignorer ces deux vérifications.) Un excellent vérificateur de style vous permettrait de modifier les tests, par exemple pour vérifier l'opposé de E020, ici.la source
TL; DR: Vous n'en avez pas besoin. C'est juste l'opinion d'un mec.
Comme beaucoup d'autres, j'écris des
for
boucles comme celle-ci depuis des décennies:Cette disposition met en évidence le fait que
do ... done
le corps de la boucle est entouré, comme les accolades dans les langages de type C, et permet aux sauts de ligne de séparer les composants de la construction de la boucle.Bien sûr, il y a des guerres de religion pour savoir où placer les accolades, donc vous pourriez dire que le jury n'est toujours pas sur celui-ci. À mon humble avis, c'est clairement ainsi que cela a été conçu pour fonctionner; Bourne aimait les délimiteurs assortis, cf.
if ... fi
,case ... esac
et la nécessité d'un point-virgule dans la version plus courte révèle que vous le rendez plus court que prévu. Aucun problème avec ça; les avancées technologiques et beaucoup de choses qui semblaient autrefois être une bonne idée sont maintenant mal vues, commegoto
. Mais jusqu'à ce que toute la communauté des scripts shell adopte les préférences desbashate
auteurs, vous n'avez rien à faire.la source
fi
correspondant àif
, etesac
etc. vient de Algol 68. La seule raison pour laquelle unefor
boucle « sdo
n'est pas fini parod
est queod
est le nom d'un utilitaire standard existant. Voir en.wikipedia.org/wiki/ALGOL_68C#Algol_68C_and_Unixbegin ... end
etc.).od
, c'est drôle ... (Bien que, pourquoi ne pas simplement finir avec des boucles pourrof
, alors?)BEGIN
et yEND
sont également définis.FOR
etDO
serait également sur des lignes distinctes, par convention, sauf lorsque la boucle entière pourrait facilement tenir sur une seule ligne.Je suis surpris que personne n'ait encore mentionné cette syntaxe valide et portable:
Notez bien cela
for
etdo
êtes sur la même ligne, sans point-virgule. Résultat:la source
for q
etdo
sur des lignes distinctes (le formulaire dans cet exemple n'était pas pris en charge il y a quelques décennies sur le shell Almquish d'origineash
): in-ulm.de/~mascheck/various/ bourne_args / # endnote )Plusieurs bonnes réponses ici. Prenez toujours des guides de style avec un grain de sel, et à mon humble avis et l'expérience, soyez toujours très légèrement à modérément préoccupé par toute communauté qui est en proie à un dogme excessif en matière de style. C'est presque comme s'ils pensaient que lorsqu'ils obtiendraient FINALEMENT le dernier pointillé et le dernier T croisé, le logiciel fonctionnerait. Parfois, il faut plus qu'un style parfait pour supprimer les bugs ...
Quand j'ai commencé à apprendre le shell, la plupart des scripts et des tutes utilisaient le format point-virgule en ligne
mais parce que j'étais inexpérimenté, j'ai eu un peu de mal à repérer le; et do - tous deux essentiels pour confirmer l'exactitude syntaxique. J'ai donc préféré le faire sur la ligne suivante tout seul. Je ne fais plus ça (jeu de mots voulu)
De plus, la commande "while" est un excellent candidat pour un petit truc sympa:
mais lorsque les commandes de préparation sont un peu volumineuses et / ou que la condition est complexe, elle est mieux formatée comme
puis ajouter le faire comme "; faire" est positivement faux.
Vous pouvez même devenir plus intense que cela:
parce que chaque déclaration est une expression. Remarquez comment les deux styles sont utilisés de manière opportuniste. Gardez-le propre et il est tout à fait lisible. Compactez-le ou contorsionnez-le au nom du style ou de "gagner de l'espace" et cela devient un horrible bordel.
Alors! Étant donné le style plutôt baroque des scripts shell en général, tout ce qui vise à accroître la clarté et à faciliter l'accès visuel aux symboles significatifs est toujours une bonne chose.
La forme où "do" est écrit en ligne avec la commande est douce quand vous avez une petite commande - je ne trouve pas le "do" visuellement caché, ni la commande intérieure vraiment obscurcie:
Je trouve cela assez agréable à regarder, et il a des analogues avec while, si et cas:
La clarté et la propreté générale sont tout ce que Codd * vous demande.
* Edgar F. Codd, père de la théorie des bases de données relationnelles.
la source
while
avec uneif
condition avant. Cool!