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

它应该将其存储为一个字符串,该字符串也应该显示“\”

相关内容