Shell-Skript (Bash): Lässt Sonderzeichen weg

Shell-Skript (Bash): Lässt Sonderzeichen weg

Ich habe ein Shell-Skript, das eine JAR-Datei ausführt und die durch die Ausführung der JAR-Datei generierte Ausgabe in einer Variablen speichert.

Z.B:

myvariable=$(java -jar MyJavaJarFile.jar)

Allerdings besteht die Ausgabe beim Ausführen der unten angegebenen Java-Anweisung aus Sonderzeichen wie /, \, +, = usw. Beim Speichern in der Variablen werden Zeichen wie \ jedoch aus der Variable weggelassen.

java -jar MyJavaJarFile.jar

Wenn die tatsächliche Ausgabe ist abc=\=abc, speichert die Variable nur abc==abc.

Kann mir jemand dabei helfen? Danke.. :)

Antwort1

Die Befehlsersetzung ( $(cmd)oder `cmd`(auch ${ cmd;}in ksh93)) speichert die Standardausgabe von cmdabzüglich der nachstehenden Zeilenumbruchzeichen (es sei denn, diese Ausgabe enthält in anderen Shells als NUL-Bytes zsh).

Mit Backslashs passiert nichts Besonderes. Die einzigen Zeichen, mit denen es Probleme geben kann, sind das NUL-Zeichen (und in manchen Shells jedes Zeichen nach dem ersten NUL-Vorkommen) und die nachfolgenden Newline-Zeichen.

var=$(printf '%s\n\n\n' 'foo\bar\\baz')

Wird gespeichert foo\bar\\bazin $var.

Wenn Sie diese Backslashs nicht sehen, $varliegt das daran, dass Sie nicht überprüft haben, ob sie richtig vorhanden sind, z. B. indem Sie eine echo„oder“ print-Implementierung verwendet haben, die Backslash-Escape-Sequenzen interpretiert.

Im UNIX-Konformitätsmodus ergibt sich beispielsweise bashFolgendes echo:

bash-4.3$ echo "$var"
foar\baz

(das \bwurde erweitert zu einemRücktasteZeichen, das beim Senden an ein Terminal dazu führt, dass es ein Zeichen zurückgeht).

Sie wollenprintfzur Ausgabe beliebiger Daten verwenden(und vergessen Sie nicht, Ihre Variablen in Anführungszeichen zu setzen):

bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz

Und wenn diese Ausgabe an ein Terminal geht, möchten Sie sie möglicherweise nachbearbeiten, damit sed -n lbeispielsweise Steuerzeichen oder nachstehende Leerzeichen sichtbar werden.


Oder es liegt daran, dass diese Backslashes nicht auf stdout ausgegeben wurden. Zum Beispiel:

foo() {
  printf foo
  printf '\\' >&2
  printf 'bar\n'
}

Beim Ausführen dieser Funktion:

bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar

Das \hat es nicht geschafft, $vares wurde an stderr ausgegeben.


Oder es könnte natürlich daran liegen, dass sie überhaupt nicht ausgegeben werden, wie Ihr Kommentar zu Benjos Antwort nahelegt, aber dann wäre das ein Problem in Ihrer Java-Anwendung, nicht bash.

Antwort2

Versuchen

myvariable="$(java -jar MyJavaJarFile.jar)"

Und es sollte als Zeichenfolge gespeichert werden, in der auch das "\" angezeigt werden sollte

verwandte Informationen