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.

24voto

Elliptical view Punkte 2740

Auch bei eingerücktem Quellcode können Sie mit <<- (mit einem abschließenden Bindestrich) um führende Tabulatoren zu ignorieren (aber keine führenden Leerzeichen).

Zum Beispiel dies:

if [ some test ]; then
    cat <<- xx
        line1
        line2
xx
fi

Gibt den eingerückten Text ohne die führenden Leerzeichen aus:

line1
line2

21voto

Zstack Punkte 2718

Normalerweise verwende ich den eingebauten Befehl read, der meiner Meinung nach flexibler und intuitiver ist. Er liest den Inhalt einer Zeile in eine Variable ein und ermöglicht eine Worttrennung, die an die spezielle Shell-Variable IFS gebunden ist. Siehe dazu Blog oder auch die Manpage für weitere Details.

read -r -d '' usage <<-EOF
    usage: up [--level <n>| -n <levels>][--help][--version] 

    Report bugs to: $report server
    up home page: $HOME
EOF
echo "$usage"

7voto

Ivan Punkte 4393

Eine weitere Sache, die Verwendung von printf mit vordefinierter Variable (hier: msg ) als Vorlage.

msg="First line %s
Second line %s
Third line %s
"

one='additional message for the first line'
two='2'
tri='this is the last one'

printf "$msg" "$one" "$two" "$tri"

Dies ^^^ druckt die gesamte Nachricht mit zusätzlich eingefügten Variablen anstelle von %s in vorgesehener Reihenfolge.

2voto

assayag.org Punkte 435
    You can write your
    text
        freely,
                   in a separate: 
                             ----file.

und dann

echo "$(</pathto/your_multiline_file)"

1voto

Gabriel Staples Punkte 20228

Tun Sie dies:

dedent() {
    local -n reference="$1"
    reference="$(echo "$reference" | sed 's/^[[:space:]]*//')"
}

text="this is line one
      this is line two
      this is line three\n"

# `text` is passed by reference and gets dedented
dedent text

printf "$text"

Ausgabe ohne Aufruf dedent Erstens:

this is line one
      this is line two
      this is line three

...und MIT Anruf dedent zuerst (wie oben gezeigt):

this is line one
this is line two
this is line three

Eine ausführliche Erklärung finden Sie an anderer Stelle, wo ich bereits darüber geschrieben habe:

  1. Äquivalent von Python's textwrap dedent in Bash
  2. Mehrzeilige Zeichenfolge mit zusätzlichem Leerzeichen (Einrückung erhalten)

Und natürlich vielen Dank an @Andreas Louv für und zeigt mir die sed Teil dieser Funktion hier .

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