2014-09-25 205 views
-1

我有點卡住了這個。我delaring一個變量在我的腳本的頂部,然後我創建一個文件作爲我的腳本的一部分:轉義bash變量

app="testing" 
cat <<EOF >/etc/init.d/test 
#!/bin/bash 
args="--emperor $APPCONF/test/$APP.ini" 
EOF 

它似乎沒有工作,雖然,它似乎在$應用程序變量。我必須對這個變量做些什麼來讓它顯示它的值,在我創建的文件裏面「測試」嗎?

+0

這與_escaping_變量有什麼關係?轉義用於防止評估某件事物,而不是強制評估它。 – Barmar 2014-09-25 13:48:25

+1

這是一個新手問題,我還在學習 – Jimmy 2014-09-25 13:49:29

+1

順便說一句,BashFAQ#50與你在這裏寫的代碼非常相關:http://mywiki.wooledge.org/BashFAQ/050 – 2014-09-25 13:52:09

回答

5

使用一致的情況。變量名稱區分大小寫。

+0

謝謝你。這是唯一的問題,我看到提到這樣做:'''args =「 - emperor $ APPCONF/test/\ $ APP.ini」''' – Jimmy 2014-09-25 13:50:20

+0

只有當你想要'$'從字面上看是在輸出中,而不是表明你想要擴展變量。嘗試一下。 – dee 2014-09-25 13:52:49

0

除了使用一致的大小寫($app不同於$APP)之外,您可能希望將變量名稱括在括號內 - 否則,如果在變量值之間使用空格,則可能會出現問題,這是一種很好的做法。例如:

args="--emperor ${APPCONF}/test/${APP}.ini" 

這樣,$APPCONF沒有得到混淆${APP}CONF也。我希望這有幫助!

+0

在某些情況下,這並沒有幫助 - 如果APPCONF具有包含空格的目錄名稱? – 2014-09-25 13:54:32

+0

我不是100%確定,但不應該被雙引號覆蓋? [* 3.1。雙引號參數(變量)引用和命令替換*](http://www.dwheeler.com/essays/filenames-in-shell.html)...說實話,從來沒有真正想過這麼多,所以感謝把它帶來:) – 2014-09-25 14:07:56

+0

雙引號處理分配結束,但不是你實際上試圖在某處使用該參數列表的一側。當你使用它時,你需要強制它在'--emperor'和文件名之間的空格上進行字符串分割;這樣做並不會在「APPCONF」擴展中分裂任何空間,這是事情變得棘手的地方。 – 2014-09-25 14:59:32

0

我不確定要理解你的問題。我想,你想用一個文件

/etc/init.d/test 

包含文本結束:

#!/bin/bash 
args="--emperor $APPCONF/test/testing.ini" 

如果這樣你的腳本應該是:

app="testing" 
cat <<EOF >/etc/init.d/test 
#!/bin/bash 
args="--emperor \$APPCONF/test/$app.ini" 
EOF 
2

比方說,你在做這個正確的方法。你要存儲在數組中的數據:

args=(--emperor "${appconf}/test/${app}.ini") 

,然後將其轉換爲字符串嵌入:

printf -v args_str '%q ' "${args[@]}"` 

...和使用您的定界符內部的字符串:

#!/bin/bash 
args=($args_str) 
EOF 

...這之外,正在創建的腳本里的任何東西將要擴大它作爲一個數組:

run_something "${args[@]}" 

請參閱BashFAQ #50的基本原理和細節。