2012-12-26 27 views
3

我有接受JSON作爲參數的實用程序。如何正確地轉義json傳遞給實用程序? 例子:在bash腳本中正確轉義Json命令行選項

ip="127.0.0.1" 
action='{\"server_ip\":\"$ip\",\"action\":\"stop\"}' 
./fix-utility -e $action 

但是JSON是沒有得到正確轉義。

回答

5

如果你想插入例如$ip裏面的字符串,你需要用雙引號。值中的雙引號需要反斜槓轉義。

ip="127.0.0.1" 
action="{\"server_ip\":\"$ip\",\"action\":\"stop\"}" 
./fix-utility -e "$action" 

其實,我建議不要存放在變量的作用,除非你的例子省略了一些重要的,這使得有必要。

+0

你能否詳細說明爲什麼我不應該在變量中存儲動作? –

+0

在這個有限的例子中,至少,這是一個多餘的複雜因素,尤其是如果你不完全確定引用和評估規則。 – tripleee

1

雙引號和單引號不被bash解釋器認爲是相同的:雖然雙引號讓bash展開包含的變量,但單引號不會。儘量簡單:

echo "$BASH_VERSION" 
4.1.5(1)-release 
echo '$BASH_VERSION' 
$BASH_VERSION 

在所有的,有一個很好的可重複使用bash的方式:

declare -A jsonVar 
toJsonString() { 
    local string='{' 
    for var in ${!jsonVar[*]} ;do 
     string+="\"$var\":\"${jsonVar[$var]}\"," 
     done 
    echo ${string%,}"}" 
} 

jsonVar[action]=stop 
jsonVar[server_ip]=127.0.1.2 

toJsonString 
{"action":"stop","server_ip":"127.0.1.2"} 

最後:

./fix-utility -e "$(toJsonString)" 

這可能如果特價字符像"雙引號來改善必須是某些字符串的一部分。