Ich muss eine komplexe XML-Datei in eine Variable innerhalb eines Bash-Skripts schreiben. Die XML-Datei muss im Bash-Skript lesbar sein, da hier das XML-Fragment abgelegt wird und nicht aus einer anderen Datei oder Quelle gelesen wird.
Meine Frage ist also, ob ich eine lange Zeichenfolge in meinem Bash-Skript habe, die für den Menschen lesbar sein soll. Wie gehe ich am besten vor?
Idealerweise möchte ich:
- keine der Charaktere entkommen zu müssen
- Lassen Sie es über mehrere Zeilen brechen, damit es für den Menschen lesbar ist
- Behalte die Einrückung
Kann man das mit EOF machen oder so, kann mir jemand ein Beispiel geben?
z.B
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
Antworten:
Dadurch wird Ihr Text in Ihre Variable eingefügt, ohne dass Sie die Anführungszeichen umgehen müssen. Es behandelt auch unausgeglichene Anführungszeichen (Apostrophe
'
). Das Setzen von Anführungszeichen um den Sentinel (EOF) verhindert, dass der Text eine Parametererweiterung erfährt. Die-d''
Ursachen es mehrere Zeilen (ignorieren Zeilenumbrüche) zu lesen.read
ist eine eingebaute Bash, daher muss kein externer Befehl wiecat
.quelle
cat
.cat
ist ein externer Befehl. Wenn Sie es nicht verwenden, sparen Sie sich das. Außerdem haben einige die Philosophie, dass, wenn Sie cat mit weniger als zwei Argumenten verwenden, "Ur doin 'it wrong" (was sich von "unnützem Gebrauch voncat
" unterscheidet).set -e
. Es scheintread
immer ungleich Null zu sein. Sie können dieses Verhalten verstärken, indem Sie! read -d .......
String
Variable zum Schreiben in eine Datei verwenden, setzen Sie die Variable um "QUOTES" wieecho "${String}" > /tmp/multiline_file.txt
oderecho "${String}" | tee /tmp/multiline_file.txt
. Ich habe mehr als eine Stunde gebraucht, um das zu finden.Du warst fast da. Entweder verwenden Sie cat für die Montage Ihres Strings oder Sie zitieren den gesamten String (in diesem Fall müssten Sie die Anführungszeichen in Ihrem String umgehen):
quelle
'EOF'
oder"EOF"
, sonst Shell - Variablen analysiert werden.Dies sollte in der Bourne-Shell-Umgebung problemlos funktionieren
quelle
Noch eine andere Möglichkeit, das Gleiche zu tun ...
Ich benutze gerne Variablen und spezielle,
<<-
die Tabellierungen am Anfang jeder Zeile ablegen, um das Einrücken von Skripten zu ermöglichen:Warnung : Es gibt kein Leerzeichen vor,
Einige Erklärungen:eof
sondern nur eine Tabellierung ."${Pattern[*]}"
dieses Array in einen String um.IFS=";"
weil es keine;
erforderlichen Zeichenfolgen gibtwhile IFS=";" read file ...
verhindertIFS
für den Rest des Skripts geändert werden.read
Verwenden Sie in diesem Fall nur die geändertenIFS
.quelle
mapfile
dass Bash 4 oder höher erforderlich ist. Und die Syntax"${Pattern[*]}"
wandelt das Array in Anführungszeichen in einen String um (wie im Beispielcode gezeigt).In vielen anderen Antworten gibt es zu viele Eckfälle.
Um absolut sicherzugehen, dass es keine Probleme mit Leerzeichen, Tabulatoren, IFS usw. gibt, ist es besser, das "heredoc" -Konstrukt zu verwenden, aber den Inhalt des heredoc
uuencode
wie folgt zu codieren :https://stackoverflow.com/questions/6896025/#11379627 .
quelle