2012-07-27 64 views
1
#!/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 

如果可能,請勿觸摸除JVM_SUPPORT_RECOMMENDED_ARGS之外的其他行。如何做適當的雙重或三重bash報價逃脫?

回答

5

雖然@ raukh的回答是正確的,即您必須逃避",但您也錯過了另一點。

對不耐煩的回答:您還需要在${JVM_SUPPORT_RECOMMENDED_ARGS}附近添加\",以防止bash將JVM_SUPPORT_RECOMMENDED_ARGS的內容分隔爲不同的參數。


完整回答:

想象這個例子中,假設print_args是呼應其每個參數在一行

TEST="a b" 
./print_args $TEST 

這將輸出ab作爲獨立參數的程序。這是因爲"被刪除,實際上執行的指令是:

./print_args a b 

爲了使您的命令來查看您的變量都作爲一個參數,你必須把它放在"

TEST="a b" 
./print_args "$TEST" 

威爾顯示a b作爲一個參數。

即使你在你的字符串編寫額外的",它不會工作,如bash將反正變量的內容分開:

TEST="\"a b\"" 
./print_args $TEST 

會給你"ab"作爲獨立參數。你可以處理這個問題的唯一方法,就是添加",你的使用這個變量,而不是你定義它的地方。

所以你的情況,解決的辦法是這樣的:

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

第一行是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 
+0

哇,這是一個很長的答案。我重新編寫了這個問題,使其更容易。我正在尋找一條線路解決方案,不多也不少。一些不需要在這一行之外進行修改的東西。 – sorin 2012-07-27 12:35:18

+1

@votingmeisfree,恐怕你不能。所有你需要做的就是在'$ {JVM_SUPPORT_RECOMMENDED_ARGS}'周圍加入'\「',這是不可能的嗎?! – Shahbaz 2012-07-27 12:40:04

+1

原因是,bash _will_擴展你的變量到不同的參數中(即使在''''變量本身,參見上面的參數5到9)。 (我知道)避免這種情況的唯一方法是在''''裏面放置'$ VARIABLE'。 – Shahbaz 2012-07-27 12:41:40