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 cmd
abzü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\\baz
in $var
.
Wenn Sie diese Backslashs nicht sehen, $var
liegt 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 bash
Folgendes echo
:
bash-4.3$ echo "$var"
foar\baz
(das \b
wurde erweitert zu einemRücktasteZeichen, das beim Senden an ein Terminal dazu führt, dass es ein Zeichen zurückgeht).
Sie wollenprintf
zur 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 l
beispielsweise 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, $var
es 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