1. Zusammenfassung
Ich verstehe nicht, warum ich die E010-Bashate-Regel brauche .
2. Einzelheiten
Ich benutze bashate zum Flusen von .sh
Dateien. E010-Regel:
tun nicht auf der gleichen Linie wie für
for
bashate:
Richtig:
#!/bin/bash for f in bash/*.sh; do sashacommand "$f" done
Error:
#!/bin/bash for f in bash/*.sh do sashacommand "$f" done
Gibt es irgendwelche gültigen Argumente, warum ich for
und do
in der gleichen Zeile brauche ?
3. Nicht nützlich
Ich kann keine Antwort auf meine Frage finden in:
- Artikel über bewährte Codierungsmethoden ( Beispiel )
bashate Dokumentation . Ich finde nur :
Eine Reihe von Regeln, mit denen die Konsistenz in Kontrollblöcken aufrechterhalten werden kann. Diese werden in langen Zeilen ignoriert, die eine Fortsetzung haben, weil das Abrollen irgendwie "interessant" ist.
bash
shell-script
Саша Черных
quelle
quelle
do
ist auf jeden Fall ein bisschen ungewöhnlich, aberfor ... \ndo\n<indent>body...
sehr häufig und ich würde sogar mehr schätzen alsfor ... ; do
. Beschwert es sich auch darüber?bashate
ist ein Stil - Checker. Stile sind von Natur aus subjektiv. Verwenden Sie es nicht, wenn Sie den Artibrary-Stil nicht mögen, den es auferlegt. Sie sollten stattdessen einen Syntax- / Bug-Checker wie Shellcheck in Betracht ziehen .E010
- nur Stil - Regel oder in einigen Fällen brauche ich für und tue nur in der gleichen Zeile nicht durch Stil Gründe.do
. Es ist wie das Einrücken der öffnenden Klammer einesif
und das Hinzufügen von Code in derselben Zeile in einer Sprache wie C. Ein anderes Beispiel, wenn Python dies zulässt, wäre das Einrücken:
einesif
Einrückungszeichens in die nächste Zeile und das Hinzufügen von Code in derselben Zeile. Es wird sich durch zusätzliche Linien im Körper unterscheiden.Antworten:
Syntaktisch sind die folgenden zwei Codeausschnitte korrekt und äquivalent:
Letzteres ist möglicherweise schwerer zu lesen, da es
do
den Befehl im Hauptteil der Schleife leicht verschleiert. Wenn die Schleife mehrere Befehle enthält und sich der nächste Befehl in einer neuen Zeile befindet, wird die Verschleierung weiter hervorgehoben:... aber es als "Fehler" zu kennzeichnen, ist meiner Meinung nach eher die persönliche Meinung eines Menschen als eine objektive Wahrheit.
Im Allgemeinen kann fast jede
;
Zeile durch eine neue Zeile ersetzt werden. Sowohl;
als auch newline sind Befehlsabschlusszeichen.do
ist ein Schlüsselwort, das bedeutet "hier folgt, was zu tun ist (in dieserfor
Schleife)".ist das gleiche wie
und wie
Der Grund für die Überlagerung ist die Lesbarkeit und die lokalen / persönlichen Stilkonventionen.
Persönliche Meinung:
Ich halte es für sinnvoll , in sehr langen Loop - Headern
do
eine neue Zeile einzufügen , wie inoder
Gleiches gilt für die
then
in einerif
Aussage.Aber auch hier kommt es auf die persönlichen Stilvorlieben an oder auf den Kodierungsstil, den das Team / Projekt verwendet.
quelle
do
, ich sehe keinen Grund , warum es in der nächsten Zeile setzen würde Lesbarkeit helfen.do
(oderthen
) in eine eigene Zeile (wie im vorletzten Beispiel). Dies alles hat mit persönlichen Vorlieben zu tun. Ich mag keine zu langen Zeilen, teilweise, weil mein Terminal "nur" 80 Zeichen breit ist, und teilweise, weil ich finde, dass es unordentlich aussieht. Ich finde es auch schwierig, sehr lange Zeilen nach Fehlern zu durchsuchen.do
"Error" in einer separaten Zeile anzeigt . Das sind ziemlich strenge Formulierungen, daher scheint es sich zu lohnen, darauf hinzuweisen, dass die sogenannte "Regel" im Gegenteil nur eine subjektive Meinung ist.Beachten Sie, was oben auf der Seite steht:
PEP8 ist der Style Guide für Python-Code. Während Python-Leute ihre Stilprobleme oft sehr ernst zu nehmen scheinen [Zitat erforderlich] , ist es nur das, ein Leitfaden. Wir könnten uns Upsides einfallen lassen, um beide
do
in die gleiche Zeile wie die zu setzenfor
zu setzen und um sie in eine eigene Zeile zu setzen.Es ist die gleiche Diskussion wie
{
beim Starten einesif
oder eineswhile
Blocks (oder eines solchen), wo der Code in C abgelegt werden soll .Ein paar Zeilen weiter unten in der Dokumentation gibt es eine andere interessante Regel:
Ich gehe davon aus, dass der Autor dieses Styleguides der Meinung ist, dass die Verwendung des
function
Schlüsselworts erforderlich ist, damit der Leser eine Funktionsdeklaration erkennt. Diesfunction foo
ist jedoch keine Standardmethode zum Definieren einer Funktion: Die Standardmethode istfoo()
. Der einzige Unterschied zwischen den beiden (in Bash) ist, dass es schwieriger ist, die andere auf eine Standard-Shell zu portieren/bin/sh
in Debian oder Ubuntu.Daher würde ich vorschlagen, alle diese Styleguides mit ein oder drei Körnern zu nehmen und selbst zu entscheiden, welcher Style der beste ist. Mit einem guten Style-Checker können Sie einige Checks deaktivieren (bashate muss
bashate -i E010,E011
diese beiden Checks ignorieren). Mit einem ausgezeichneten Style-Checker können Sie die Tests modifizieren, z. B. um hier nach dem Gegenteil von E020 zu suchen.quelle
TL; DR: Das musst du nicht. Es ist nur die Meinung eines Typen.
Wie viele andere schreibe ich seit
for
Jahrzehnten Loops wie diese:Dieses Layout unterstreicht die Tatsache, dass
do ... done
der Schleifenkörper wie geschweifte Klammern in C-ähnlichen Sprachen umgeben ist, und ermöglicht es Zeilenumbrüchen, die Komponenten des Schleifenkonstrukts zu trennen.Natürlich gibt es auch religiöse Kriege darüber, wo die geschweiften Klammern platziert werden sollen. Man könnte also sagen, dass die Jury über diese noch nicht entschieden hat. IMHO, dies ist eindeutig, wie dies entworfen wurde, um zu funktionieren; Borowski mochte übereinstimmende Trennzeichen, vgl.
if ... fi
,case ... esac
Und die Notwendigkeit für ein Semikolon in der kürzeren Version zeigt , dass Sie machen es kürzer ist als ursprünglich entworfen. Daran ist nichts auszusetzen. technologische fortschritte und viele dinge, die früher eine gute idee schienen, werden jetzt missbilligtgoto
. Aber bis die gesamte Shell-Scripting-Community die Präferenzen derbashate
Autoren übernimmt , müssen Sie nichts tun.quelle
fi
, was entsprichtif
, undesac
so weiter, stammt von Algol 68. Der einzige Grund, warum einefor
Schleifedo
nicht beendetod
wird,od
ist der Name eines vorhandenen Standarddienstprogramms. Siehe en.wikipedia.org/wiki/ALGOL_68C#Algol_68C_and_Unixbegin ... end
usw. verwendet).od
, das ist lustig ... (Warum also nicht einfach mit for-loopsrof
BEGIN
undEND
sind dort auch definiert.FOR
undDO
würde auch in getrennten Zeilen sein, außer wenn die gesamte Schleife leicht in eine einzelne Zeile passen würde.Ich bin überrascht, dass noch niemand diese gültige und portable Syntax erwähnt hat:
Beachten Sie dies sorgfältig
for
unddo
stehen in derselben Zeile ohne Semikolon. Ergebnis:quelle
for q
unddo
in separaten Zeilen (das Formular in diesem Beispiel wurde vor einigen Jahrzehnten auf der ursprünglichen Almquish-Shell (ash
) nicht unterstützt ): in-ulm.de/~mascheck/various/ bourne_args / # endnote )Hier einige gute Antworten. Nehmen Sie Styleguides immer mit einem Körnchen Salz und seien Sie meiner Meinung nach ein bisschen bis mäßig besorgt über jede Community, die in puncto Stil von übermäßigem Dogma geprägt ist. Es ist fast so, als ob sie glauben, dass die Software funktionieren wird, wenn sie das letzte Mal, dass ich gepunktet habe, und das letzte Mal, dass ich es überschritten habe, ENDLICH bekommen. Manchmal braucht es mehr als perfekten Stil, um Fehler zu entfernen ...
Als ich anfing, Shell zu lernen, verwendeten die meisten Skripte und Tutes das Inline-Semikolon-Format
aber weil ich unerfahren war, fiel es mir ein bisschen schwer, die zu entdecken; und do - beides ist wichtig, um die syntaktische Korrektheit zu bestätigen. Also habe ich es vorgezogen, in der nächsten Zeile alles alleine zu machen. Ich mache das nicht mehr (Wortspiel beabsichtigt)
Außerdem ist der Befehl 'while' ein hervorragender Kandidat für einen kleinen Trick:
Wenn die Vorbereitungsbefehle jedoch etwas umfangreich sind und / oder die Bedingung komplex ist, ist es besser, sie so zu formatieren
und dann das Anhängen des do als "; do" ist positiv flüchtig.
Sie können sogar noch intensiver werden:
weil jede aussage ein ausdruck ist. Beachten Sie, wie beide Stile opportunistisch verwendet werden. Halten Sie es sauber und es ist gut lesbar. Kompakt oder verdreht es im Namen des Stils oder "platzsparend" und es wird ein schreckliches Durcheinander.
So! Angesichts des eher barocken Stils von Shell-Skripten im Allgemeinen ist es immer eine gute Sache, die Übersichtlichkeit und den visuellen Zugang zu wichtigen Symbolen zu verbessern.
Die Form, in der 'do' in den Befehl geschrieben ist, ist süß, wenn Sie einen kleinen Befehl haben - ich finde das 'do' weder visuell verborgen, noch ist der innere Befehl wirklich verdeckt:
Ich finde das sehr angenehm anzusehen, und es hat Analogien mit while, if und case:
Klarheit und allgemeine Ordnung sind alles, was Codd * von Ihnen verlangt.
* Edgar F. Codd, Vater der relationalen Datenbanktheorie.
quelle
while
mit einerif
Krankheit gesehen. Cool!