2017-06-27 4 views
0

Ich versuche, eine mehrzeilige Zeichenfolge sauber zu erstellen, die Backslashes und Variablensubstitution enthält. Ursprünglich habe ich nicht Schrägstriche müssen und war in der Lage zu erreichen, was ich mit diesem Code-Schnipsel benötigt:Mehrzeilige Zeichenfolge mit Zeilen, die mit einem Schrägstrich enden

  description=$(cat <<EOF 
Creation time: $(date) 
Creator: $test_group_creator 
Test group: $test_group 
Test execution: $test_execution_id - $test_name 
Adapter: $initiator1_mac_addr 

http://... 
EOF 
) 

Es ist nicht ideal, da es ein wenig klobig am Ende aussieht und erfordert ich die Einrückungsebene des Codes zu brechen, aber es ist ziemlich klar und stellt dar, wie die Beschreibung später auf einer Webseite erscheinen wird. (. Ich bin mir der < < -EOF Syntax, aber wir sind mit 4-Raum-Einzüge in Code und die Syntax erfordert Tabs) Hier wird die Variable Echo aus:

Creation time: Tue Jun 27 15:22:27 PDT 2017 
Creator: langlorx 
Test group: all 
Test execution: 13 - go 
Adapter: eth0 

link... 

jedoch vor kurzem, der Text hat wurde auch in einen Wiki-Parser eingefügt und jetzt werden Zeilenumbrüche auf ein einzelnes Leerzeichen reduziert. Um einen Zeilenumbruch im mittleren Absatz zu erzwingen, muss die Zeile in einem doppelten Backslash enden. Da ich wusste, dass Bash Backslashes speziell behandelt, wusste ich, dass ich die Double Backslashes verdoppeln musste, aber es kam immer noch nicht richtig raus. dies mit:

  description=$(cat <<EOF 
Creation time: $(date)\\\\ 
Creator: $test_group_creator\\\\ 
Test group: $test_group\\\\ 
Test execution: $test_execution_id - $test_name\\\\ 
Adapter: $initiator1_mac_addr\\\\ 

http://... 
EOF 
) 

Ich finde, dass die Zeilenumbrüche vollständig in der resultierenden Variable weg sind, und die letzte \\\\ Sequenz, bevor die Leerzeile Ergebnisse in einem einzigen Schrägstrich in den Variablen mit der Leerzeile komplett verschwunden. Ohne umgekehrte Schrägstriche kommt die resultierende Zeichenfolge genau wie oben beschrieben mit Zeilenumbrüchen, Leerzeilen und mit den ersetzten Variablen heraus. Sobald ich alle Backslashes am Ende einer Zeile einfüge, löst es in bash einen anderen Regelsatz für die Codierung der Variablen aus.

Creation time: Tue Jun 27 15:20:17 PDT 2017\\Creator: user\\Test group: all\\Test execution: 12 - go\\Adapter: eth0\link... 

Gibt es einen besseren Weg, dies in bash zu tun, als zu versuchen, Katze und Kommandosubstitution zu missbrauchen, während immer noch den Code etwas sauber zu haben?

Antwort

1

Speichern Sie die Daten in dem Format, das Sie möchten, und verarbeiten Sie sie dann nach Bedarf. Wenn Sie führende Leerzeichen ignoriert werden sollen und hängen \\ jeder Zeile, genau das zu tun:

embed() { sed -e 's/^ *//; s/$/\\\\/'; } 

description=$(embed << eof 
    Creation time: $(date) 
    Creator: foo 
    Test group: bar 
    etc 
eof 
) 

printf '%s\n' "$description" 

geben Ihnen:

Creation time: Tue Jun 27 15:33:31 PDT 2017\\ 
Creator: foo\\ 
Test group: bar\\ 
etc\\ 
Verwandte Themen