我有一個 shell 腳本,它執行一個 jar 檔案並將執行該 jar 檔案產生的輸出儲存到一個變數中。
例如:
myvariable=$(java -jar MyJavaJarFile.jar)
然而,當我執行下面給出的java語句時,輸出由特殊字符組成,例如/,\,+,=等。
java -jar MyJavaJarFile.jar
如果實際輸出為abc=\=abc
,則變數僅儲存abc==abc
。
有人可以幫我解決這個問題嗎?謝謝.. :)
答案1
命令替換($(cmd)
或`cmd`
(也在ksh93 中))儲存減去尾隨換行符${ cmd;}
的標準輸出(除非該輸出在除 之外的 shell 中包含 NUL 位元組)。cmd
zsh
它對反斜線沒有什麼特別的作用。它唯一可能弄亂的字元是 NUL 字元(以及某些 shell 中第一個 NUL 出現之後的每個字元)和那些尾隨換行符。
var=$(printf '%s\n\n\n' 'foo\bar\\baz')
將儲存foo\bar\\baz
在$var
.
如果您沒有看到這些反斜杠,$var
可能是因為您沒有檢查它們是否正確存在,例如使用解釋反斜杠轉義序列的echo
or實現。print
例如,在 UNIX 一致性模式下,bash
的echo
給出:
bash-4.3$ echo "$var"
foar\baz
(\b
被擴展為退格鍵發送到終端時會使其後退一個字元的字元)。
你想要用於printf
輸出任意數據(並且不要忘記引用您的變數):
bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz
當該輸出到達終端時,您可能需要使用sed -n l
控製字元或尾隨空格字元等對其進行後處理,使其變得可見。
或者是因為這些反斜線沒有在標準輸出上輸出。例如:
foo() {
printf foo
printf '\\' >&2
printf 'bar\n'
}
運行函數時:
bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar
沒有\
成功,$var
它被輸出到 stderr。
或者當然可能是因為它們根本沒有輸出,正如您對 Benjo 答案的評論所暗示的那樣,但這將是您的 java 應用程式中的問題,而不是bash
.
答案2
嘗試
myvariable="$(java -jar MyJavaJarFile.jar)"
它應該將其儲存為一個字串,該字串也應該顯示“\”