430 Stimmen

Wie gibt man eine mehrzeilige Zeichenkette in der Bash aus?

Wie kann ich eine mehrzeilige Zeichenkette in der Bash ausgeben, ohne mehrere echo-Aufrufe zu verwenden, etwa so:

echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo 
echo "Report bugs to: "
echo "up home page: "

Ich bin auf der Suche nach einem portablen Weg, dies zu tun, nur mit Bash builtins.

493voto

Dennis Williamson Punkte 322329

Hier werden häufig Dokumente zu diesem Zweck verwendet.

cat << EOF
usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to: 
up home page:
EOF

Sie werden von allen von Bourne abgeleiteten Shells einschließlich aller Versionen der Bash unterstützt.

280voto

Chris Mohr Punkte 3489

Oder Sie können dies tun:

echo "usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to: 
up home page: "

107voto

Jorge Punkte 1147

Angeregt durch die aufschlussreichen Antworten auf dieser Seite habe ich einen gemischten Ansatz entwickelt, den ich für den einfachsten und flexibelsten halte. Was meinen Sie dazu?

Zunächst definiere ich die Verwendung in einer Variablen, die es mir ermöglicht, sie in verschiedenen Kontexten wiederzuverwenden. Das Format ist sehr einfach, fast WYSIWYG, ohne die Notwendigkeit, irgendwelche Steuerzeichen hinzuzufügen. Dies scheint mir einigermaßen portabel zu sein (ich habe es auf MacOS und Ubuntu ausgeführt)

__usage="
Usage: $(basename $0) [OPTIONS]

Options:
  -l, --level <n>              Something something something level
  -n, --nnnnn <levels>         Something something something n
  -h, --help                   Something something something help
  -v, --version                Something something something version
"

Dann kann ich es einfach verwenden als

echo "$__usage"

oder noch besser, beim Parsen von Parametern kann ich sie einfach in einem Einzeiler wiedergeben:

levelN=${2:?"--level: n is required!""${__usage}"}

62voto

nhahtdh Punkte 54526

Verwenden Sie -e können Sie neue Zeilenzeichen mit der Option \n in der Zeichenkette.

Zum Beispiel:

echo -e "This will be the first line \nand this will be on the second line"

28voto

Gordon Davisson Punkte 105638

Da ich empfohlen habe printf in einem Kommentar, sollte ich wahrscheinlich einige Beispiele für die Verwendung geben (obwohl ich für den Druck einer Verwendungsnachricht eher die Antworten von Dennis oder Chris verwenden würde). printf ist etwas komplexer in der Anwendung als echo . Das erste Argument ist ein Formatstring, in dem Escapes (wie \n ) sind immer interpretiert; sie kann auch Formatanweisungen enthalten, die mit % , die bestimmen, wo und wie zusätzliche Argumente in den Text aufgenommen werden. Hier sind zwei verschiedene Ansätze zur Verwendung für eine Verwendungsmeldung:

Zunächst könnten Sie die gesamte Nachricht in die Formatzeichenfolge aufnehmen:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n"

Beachten Sie, dass im Gegensatz zu echo müssen Sie den abschließenden Zeilenumbruch explizit einfügen. Auch wenn die Nachricht zufällig irgendetwas enthält % Zeichen, müssten sie geschrieben werden als %% . Wenn Sie die Bugreport- und Homepage-Adressen mit einbeziehen möchten, können diese natürlich hinzugefügt werden:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage"

Zweitens könnten Sie einfach die Formatzeichenfolge verwenden, um jedes zusätzliche Argument in einer eigenen Zeile auszugeben:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: "

Mit dieser Option ist das Hinzufügen der Bugreport- und Homepage-Adressen ziemlich offensichtlich:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X