![如何在 shell 脚本中正确连接字符串?](https://linux22.com/image/27879/%E5%A6%82%E4%BD%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%AD%A3%E7%A1%AE%E8%BF%9E%E6%8E%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我有一个 bash 脚本需要修改。我必须设置一个变量,然后调用另一个脚本。我的变量,EXTRA_JAVA_OPTIONS
必须是
-javaagent:myagent.jar="-d 0 -i 1000 -l log2 -c log1"
所以我所做的是
export EXTRA_JAVA_OPTIONS="-javaagent:myagent.jar=\"-d 0 -i 1000 -l log2 -c log1 \""
然后我调用我的脚本,脚本内有以下内容:
"$JAVACMD" "$EXTRA_JAVA_OPTIONS"
但是,这不会产生我想要的结果。运行 bash -x 我可以看到
+ /usr/java/jdk1.6.0_38/bin/java '-javaagent:myagent.jar="-d 0 -i 1000 -l log2 -c log1"'
如果相反我这样做:
"$JAVACMD" $EXTRA_JAVA_OPTIONS
我得到了不同版本的输出,这也是错误的
+ /usr/java/jdk1.6.0_38/bin/java '-javaagent:myagent.jar="-d' 0 -i 1000 -l log2 -c 'log1"'
如何防止'
在打印字符串或由 shell 添加字符串时出现?
答案1
使用数组是保持包含空格的参数完整的安全方法:
EXTRA_JAVA_OPTIONS=(-javaagent:myagent.jar="-d 0 -i 1000 -l log2 -c log1")
"$JAVACMD" "${EXTRA_JAVA_OPTIONS[@]}"
答案2
引号只是为了防止按单词分割。但你已经对整个事情进行了引用。
export EXTRA_JAVA_OPTIONS="-javaagent:myagent.jar=-d 0 -i 1000 -l log2 -c log1"