Shell 腳本(Bash):省略特殊字元

Shell 腳本(Bash):省略特殊字元

我有一個 shell 腳本,它執行一個 jar 檔案並將執行該 jar 檔案產生的輸出儲存到一個變數中。

例如:

myvariable=$(java -jar MyJavaJarFile.jar)

然而,當我執行下面給出的java語句時,輸出由特殊字符組成,例如/,\,+,=等。

java -jar MyJavaJarFile.jar

如果實際輸出為abc=\=abc,則變數僅儲存abc==abc

有人可以幫我解決這個問題嗎?謝謝.. :)

答案1

命令替換($(cmd)`cmd`(也在ksh93 中))儲存減去尾隨換行符${ cmd;}的標準輸出(除非該輸出在除 之外的 shell 中包含 NUL 位元組)。cmdzsh

它對反斜線沒有什麼特別的作用。它唯一可能弄亂的字元是 NUL 字元(以及某些 shell 中第一個 NUL 出現之後的每個字元)和那些尾隨換行符。

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

將儲存foo\bar\\baz$var.

如果您沒有看到這些反斜杠,$var可能是因為您沒有檢查它們是否正確存在,例如使用解釋反斜杠轉義序列的echoor實現。print

例如,在 UNIX 一致性模式下,bashecho給出:

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)"

它應該將其儲存為一個字串,該字串也應該顯示“\”

相關內容