Ich bin neu im Shell-Scripting. Ich habe eine Variable in einem Shell-Skript, in der ich die Daten formatieren möchte. Die Variable speichert neue Daten während jeder Wiederholung einer Schleife. Bei jeder Speicherung der neuen Daten möchte ich ein neues Zeilenzeichen einfügen. So versuche ich, die Daten in der Variablen zu speichern.
VARIABLE="$VARIABLE '\n' SomeData"
Leider enthält die Ausgabe das Literal '\n'
Jede Hilfe wäre dankbar. Danke im Voraus.
$'\n'
versuchen:
VAR=a
VAR="$VAR"$'\n'b
echo "$VAR"
gibt mir
a
b
Eine übliche Technik ist:
nl='
'
VARIABLE="PreviousData"
VARIABLE="$VARIABLE${nl}SomeData"
echo "$VARIABLE"
PreviousData
SomeData
VAR="one"
VAR="$VAR.\n.two"
echo -e $VAR
ein.
.zwei
Anders als $'\n'
können Sie printf
auch so verwenden:
VARIABLE="Foo Bar"
VARIABLE=$(printf "${VARIABLE}\nSomeData")
echo "$VARIABLE"
AUSGABE:
Foo Bar
SomeData
Es ist viel einfacher als Sie denken:
VARIABLE="$VARIABLE
SomeData"
Anführungszeichen Alle Sonderzeichen zwischen diesen Anführungszeichen verlieren ihre spezielle Bedeutung.
https://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm
Die von Ihnen verwendete Syntax bewirkt also etwas anderes, das Sie erreichen möchten.
Das brauchen Sie:
Das $ '\ X'-Konstrukt macht die Option -e im Echo überflüssig .
https://linux.die.net/abs-guide/escapingsection.html
echo -e "something\nsomething"
oder
echo "something"$'\n'"something"
Ich hatte ein Problem mit allen anderen Lösungen: Wenn Sie einen #
, gefolgt von SPACE
(häufig beim Schreiben in Markdown) verwenden, würden beide in eine neue Zeile aufgeteilt.
Eine andere Möglichkeit wäre es, einfache Anführungszeichen zu verwenden, damit "\ n" gerendert wird.
FOO=$'# Markdown Title #\n'
BAR=$'Be *brave* and **bold**.'
FOOBAR="$FOO$BAR"
echo "$FOOBAR"
Ausgabe:
# Markdown Title #
Be *brave* and **bold**.
Aufbauend auf den ersten beiden Lösungen würde ich wie folgt vorgehen. Das Verknüpfen von Strings mit dem Operator "+ =" sieht für mich irgendwie klarer aus.
Denken Sie auch daran, printf im Gegensatz zum Echo zu verwenden. Sie sparen sich so viel Ärger
sometext="This is the first line"
sometext+=$'\n\n'
sometext+="This is the second line AFTER the inserted new lines"
printf '%s' "${sometext}"
Ausgänge:
Dies ist die erste Zeile
Dies ist die dritte Zeile NACH der eingefügten neuen Zeile