我有一个 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)"
它应该将其存储为一个字符串,该字符串也应该显示“\”