sor*_*rin 1 bash quotes escaping double-quotes
#!/bin/bash
# this works: java '-XX:OnOutOfMemoryError=nohup bash -c "service jira stop;service jira stop" &' -version
JVM_SUPPORT_RECOMMENDED_ARGS="" # WHAT TO PUT HERE !?! so the last line will execute the command above?
JAVA_OPTS=" ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${DISABLE_NOTIFICATIONS} ${JVM_SUPPORT_RECOMMENDED_ARGS} ${JVM_EXTRA_ARGS} ${JIRA_HOME_MINUSD}"
set -x
java $JAVA_OPTS -version
Run Code Online (Sandbox Code Playgroud)
如果可能,请勿触摸除JVM_SUPPORT_RECOMMENDED_ARGS之外的其他行.
虽然@ raukh的回答是正确的,即你必须逃避",但你也错过了另一个观点.
回答了不耐烦:你需要添加\"周围${JVM_SUPPORT_RECOMMENDED_ARGS}也,以防止庆典从内容分离JVM_SUPPORT_RECOMMENDED_ARGS到不同的观点.
完整答案:
想象一下这个例子,假设print_args是一个程序,它在一行中回应它的参数
TEST="a b"
./print_args $TEST
Run Code Online (Sandbox Code Playgroud)
这将输出a并b作为单独的参数.这是因为"删除了,实际上执行的命令是:
./print_args a b
Run Code Online (Sandbox Code Playgroud)
要使您的命令将变量全部视为一个参数,您必须将其放入":
TEST="a b"
./print_args "$TEST"
Run Code Online (Sandbox Code Playgroud)
将显示a b为一个参数.
即使你"在字符串中写了额外的内容,它也行不通,因为bash会将变量的内容分开:
TEST="\"a b\""
./print_args $TEST
Run Code Online (Sandbox Code Playgroud)
会给你"a和b"作为单独的论点.你可以处理这个问题的唯一办法,就是加"在您使用的变量,而不是在那里你定义它.
所以在你的情况下,解决方案是这样的:
JVM_SUPPORT_RECOMMENDED_ARGS="java '-XX:OnOutOfMemoryError=nohup bash -c \"service jira stop;service jira stop\" &' test"
JAVA_OPTS=" ${JAVA_OPTS} ${JVM_REQUIRED_ARGS} ${DISABLE_NOTIFICATIONS} \"${JVM_SUPPORT_RECOMMENDED_ARGS}\" ${JVM_EXTRA_ARGS} ${JIRA_HOME_MINUSD}"
Run Code Online (Sandbox Code Playgroud)
第一行是raukh建议的.第二行增加\"了${JVM_SUPPORT_RECOMMENDED_ARGS}.
如果你想测试这个,这是一个例子:
test.c:
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
for (i = 0; i < argc; ++i)
printf("%d: %s\n", i, argv[i]);
return 0;
}
$ gcc -o print_args test.c
$ TEST="java '-XX:OnOutOfMemoryError=nohup bash -c \"service jira stop;service jira stop\" &' test"; ./print_args $TEST
0: ./print_args
1: java
2: '-XX:OnOutOfMemoryError=nohup
3: bash
4: -c
5: "service
6: jira
7: stop;service
8: jira
9: stop"
10: &'
11: test
$ TEST="java '-XX:OnOutOfMemoryError=nohup bash -c \"service jira stop;service jira stop\" &' test"; ./print_args "$TEST"
0: ./print_args
1: java '-XX:OnOutOfMemoryError=nohup bash -c "service jira stop;service jira stop" &' test
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7040 次 |
| 最近记录: |