2017-03-17 2 views
0

Ich versuche, eine Zeichenfolge an ein Java-Programm als Befehlszeilenargument für einige Verarbeitung übergeben und es funktioniert gut, außer für Szenario, wo das String-Argument einige Sonderzeichen (wie $). Bei einer SOP stelle ich fest, dass das Argument selbst mit einigen Zufallszahlen anstelle der Sonderzeichen verzerrt wurde. Dies geschieht NUR unter Linux und NUR wenn das Argument einige Sonderzeichen hat.

$ java -jar testclient.jar String$$123 
String 1 = String31733123 
+3

Zitieren Sie es. 'java -jar testclient.jar 'String $$ 123'' –

+1

' $$ 'ist die Prozess-ID. Sie müssen entkommen, wenn Sie nicht möchten, dass die Shell sie durch eine Zahl ersetzt. z.B. ''String $$ 123'' –

+0

Das sind (wahrscheinlich alle) spezielle Bash-Variablen: https://www.gnu.org/software/bash/manual/html_node/Variable-Index.html - Sie müssen" entkommen " "Sie (zB: indem Sie Ihre Parameter in Anführungszeichen setzen) – UnholySheep

Antwort

1

Dieses NUR in Linux geschieht und nur, wenn das Argument einige Sonderzeichen hat.

Das ist, weil es die Linux-Shell ist, die mit dem $-Zeichen, nicht Java "veralbert" wird. Die $ ist ein Shell-Meta-Zeichen. Speziell führt es eine Shell-Parameter-Erweiterung ein. Abhängig davon, welche Zeichen dem Zeichen $ folgen, wird die Shell sie durch etwas anderes ersetzen. Die modifizierten Zeichen werden dann für die Befehlszeilenargumente verwendet, die an die ausführbare Datei java übergeben werden.

Sie können die Dokumentation für schel Parameter Erweiterungen finden (für die „bash“ shell) hier:

Beachten Sie, dass die gleiche Sache auf dem Mac OS X-Befehlszeile passieren wird und auf anderen Dialekten von UNIX und Linux.


Wenn Sie wollen, dass die $ Zeichen übergeben werden, wie sie ist, dann muss es zitiert werden. Die verschiedenen Möglichkeiten des Tuns, die hier beschrieben werden:

In der Tat, sollten Sie vielleicht die gesamte "bash" Handbuch lesen ... oder ein Tutorial. Es wird Ihnen auf lange Sicht viel Zeit sparen.


Gibt es etwas, dass Java diese Zeichenfolge, um sicherzustellen, getan werden könnte Eingaben analysiert, wie es ist, ohne Escape-Sequenzen zu verwenden?

Nein. Der "Schaden" wurde bereits zu dem Zeitpunkt ausgeführt, als Java die Befehlszeilenargumente sieht.