2014-08-27 2 views
9

Ich habe einen Anruf mit einer ziemlich langen Liste von Argumenten in meinem Shell-Skript:Zeilenfortsetzung + Zeilenkommentar, in derselben Zeile?

foo-command \ 
    --important-argument $ONE \ 
    --indispensable-flag $ENABLED \ 
    --an-optional-toggle "will probably be commented out some day" \ 
    $ARGUMENTS \ 
    $MORE_ARGUMENTS 

ich einfügen Kommentare können nicht in diesem mehrzeiligen Anruf, kann ich das?

Zum Beispiel sagen wir mal, wie kann ich die --an-optional-toggle Zeile auskommentieren?
Wie kann ich einen # in sorted order Kommentar nach $ARGUMENTS hinzufügen?

Egal was ich versuche, die octothorp # Symbol Schatten Linie Fortsetzung Backslash \ oder umgekehrt. Irgendwelche Ratschläge?

Antwort

6

Nein, aber Sie können die Argumente stattdessen in einem Array speichern. Auf diese Weise können Sie sowohl eine einzelne Zeile auskommentieren als auch eingestreute Kommentare einfügen.

args=(--important-argument "$ONE" 
     --indispensable-flag "$ENABLED" 
     # --an-optional-toggle "will probably be commented out some day" 
     $ARGUMENTS # in sorted order 
     $MORE_ARGUMENTS 
    ) 
foo-command "${args[@]}" 

Beachten Sie, dass Sie mit ziemlicher Sicherheit wollen auch ARGUMENTS und MORE_ARGUMENTS Arrays machen, so würde args wie am Ende der Suche

args=(--important-argument "$ONE" 
     --indispensable-flag "$ENABLED" 
     # --an-optional-toggle "will probably be commented out some day" 
     "${ARGUMENTS[@]}" # in sorted order 
     "${MORE_ARGUMENTS[@]}" 
    ) 
+0

+1 mit BASH-Arrays ist der richtige Weg als mit langen mehrzeiligen Befehlszeile. – anubhava

+0

Als Randnotiz: Dies ist streng genommen ein Bash-abhängiger Ansatz. Arrays funktionieren nicht in älteren Shells a.k.a "sh", was für jemanden von Bedeutung sein kann. – ulidtko

+1

Wenn Sie Bedenken hinsichtlich der Portabilität haben, markieren Sie Ihre Frage 'sh' anstelle von' bash'. – chepner

1
foo-command $(
    # hello 
    printf --important-argument $ONE # free as a bird 
    printf --indispensable-flag $ENABLED 
    # to comment anywhere we wish 
    printf --an-optional-toggle "will probably be commented out some day" 
    printf $ARGUMENTS 
    printf $MORE_ARGUMENTS 
) 

Es ist nicht perfekt: Echo -n hart ist, weil echo interpretiert; Zitate können verschwinden, wenn Sie sie lieber behalten möchten, usw. In der Tat, wie Kommentatoren unten sagen, wird die zitierte Zeichenkette gestört; vielleicht kannst du das umgehen, aber andere Antworten hier sind besser, wenn du Bash hast.

+2

Wenn das Argument an den optionalen Kommentar tatsächlich Leerzeichen enthält, wird dies nicht funktionieren. – chepner

+1

Dies kann verbessert werden. 'printf' anstelle von' echo' wird einige Probleme lindern, einschließlich '-n' (und andere) Interpretation. Befehlsersatz kann inline sein und eine zusätzliche Funktionsdefinition loswerden. – ulidtko

+0

Ihr habt recht, @ chepners Antwort ist eine bessere Version von dem was ich hier gemacht habe. Alle grüßen den Bash Master. –

5

Versuchen der Graviszeichen Kommentaras proposed in an earlier response auf die gleiche Frage hacken.

In Ihrem Fall wäre dies:

foo-command \ 
    --important-argument $ONE \ 
    --indispensable-flag $ENABLED \ 
    `#--an-optional-toggle "will probably be commented out some day"` \ 
    $ARGUMENTS \ 
    $MORE_ARGUMENTS 
+1

Achten Sie darauf, dass die kommentierte Zeile selbst keine Befehlsersetzungen enthält, da sie immer noch erweitert werden. – chepner