2014-03-07 166 views
0

單引號單引號字符內bash中逃脫

我試圖自動創建一個kickstart文件的問題,我使用解析它的工具需要在kickstart作爲字符串來提供用單引號。

大部分情況都很好,除了使用awk的postinstall腳本,因此單引號內的單引號。

我看了一些其他的帖子,並試圖逃脫字符串,無濟於事。

我明顯誤解了轉義的一些基本原理。

代碼

DATA=' 
GATEWAY=$(localcli network ip route ipv4 list | grep default | awk \'{print $3}\') 
' 
echo ${DATA} 

所需的輸出

這是文字輸出串我想看到。

GATEWAY=$(localcli network ip route ipv4 list | grep default | awk '{print $3}') 

任何幫助將不勝感激!

感謝

馬特

回答

2

既然你無法逃避的單引號字符串中的字符,你必須做的是外:

~$ echo 'abc'\''cde' 
abc'cde 

或者,使用雙引號字符串(需要轉義$

DATA=" 
GATEWAY=\$(localcli network ip route ipv4 list | grep default | awk '{print \$3}') 
" 
+0

雙引號str ing看起來對我來說是最好的解決方案。 非常感謝! – MattY

+0

我知道的最簡單的方法就是使用''printf'''將任何字符串轉換爲bash轉義的字符串:'''printf「%q」「$ str」''' – exbuddha

0

如果您必須在您的DATA變量定義中使用單引號,用cut代替awk可能是一種解決方法。

如:

$ echo "first second third" > ex.txt 
$ awk '{print $3}' ex.txt 
third 
$ cut -d" " -f3 ex.txt 
third 
1

有— $'...' —可供bash中,你可以逃避單引號一個鮮爲人知的第三類報價:

DATE=$'GATEWAY=$(...| awk \'/default/ {print $3}\')' 

(這也說明了爲什麼管道grep分成awk通常是不必要的。)