2016-11-14 40 views
0

我正在創建一個簡單腳本,以便於在Apache服務器上設置虛擬主機。目前我似乎無法編寫配置文件,因爲它在一個變量中。我如何解決它。這是我的代碼不起作用。Bash寫入由變量命名的文件

siteConf="/etc/apache2/sites-available/$domain.conf" 
echo "creating conf file" 
echo "<VirtualHost *:80>" >> $siteConf 
echo "ServerName *.$domain" >> $siteConf 
echo "DocumentRoot $publicHtmlLoc" >> $siteConf 
echo "DirectoryIndex index.php" >> $siteConf 
echo "ServerAlias $database.newphp.junglecoders.dk" >> $siteConf 
echo "</VirtualHost>" >> $siteConf 

我正在使用bash命令運行腳本。

編輯:我得到的錯誤是這樣的

$siteConf: ambiguous redirect 

域來自這裏:

echo "Write websiter url example.com, no sub dir allowed" 
read -p "Name: " domain 

正如評論認爲其是錯誤的路徑,我試圖呼應了變量,我可以看到它刪除了'。'因爲某些原因而留下空間,爲什麼劇本會這樣做?

EDIT2: 在腳本中使用IFS較早,分裂域名

+0

'echo「...」>> $ varname' should be working。通常情況下,您首先要使用'echo ..> $ file'作爲單個'>'重定向,因此它會刪除之前文件中的所有內容。除非你有足夠的理由保留你的domain.conf文件,否則最好刪除它,然後再次嘗試運行你的代碼。它可能已經在工作了(如果你只是看着你的文件的「頂部」,它可能會填滿空白行(我怎麼知道的?doah!);-))。祝你好運。 – shellter

+0

你會得到什麼結果?該代碼看起來好像它應該工作。 ''echo'「可能會更好。 ...;回聲「」; }> $ siteConf'(或'>> $ siteConf')。你從'bash -x your-script.sh'中得到了什麼?在域環境中設置了「域」嗎?如果不是,則編輯文件'/ etc/apache2/sites-available/.conf'。 –

+2

當名稱變量不存在或爲空時,您會得到'模糊重定向'。這表明你的腳本的第一行並不是你所得到的準確表示,但很難猜測你的錯誤。拼寫錯誤的名稱或不需要的空間可能是最有可能的,但它可能是別的。 –

回答

4

的代碼看起來好像它應該工作。你可能做得更好

{ 
echo "<VirtualHost …>" 
… 
echo "</VirtualHost>" 
} > $siteConf 

(或>> $siteConf如果你真的想添加到現有的文件)。這爲所有輸出執行單個重定向,並截斷該文件。這也是作爲一般規則附上的變量使用雙引號中是一個好主意:

} > "$siteConf" 

基本調試shell腳本:

  • 你從bash -x your-script.sh得到什麼?

你得到「曖昧重定向」時,將名爲不存在或爲空,或者變量,如果它擴展到兩個或多個單詞。這表明你的腳本的第一行並不是你所得到的準確表示,但很難猜測你的錯誤。拼寫錯誤的名稱或不需要的空間可能是最有可能的,但它可能是別的。

好吧,看起來像我需要答案Getting an 'ambiguous redirect' errorantak建議把它包起來就像在報價等。

這是一個很好的交叉參考問題。有一次,這個問題作爲它的一個副本被關閉,但這裏的問題原來是關於IFS的設置,這不是另一個問題中發現的麻煩的替代來源。

你有沒有在劇本中的任何一點弄亂IFS?

是 - 一直在做IFS將URL拆分成部分。

需要注意的是:

set_with_spaces="name1 name2" 
echo Hi >> $set_with_spaces 

產量

bash: $set_with_spaces: ambiguous redirect too. 

兩個名字從一個變量產生。

$ IFS=. 
$ domain=abc.def.ghi.jkl 
$ echo $domain 
abc def ghi jkl 
$ echo "$domain" 
abc.def.ghi.jkl 
$ IFS=$' \t\n' 
$ echo $domain 
abc.def.ghi.jkl 
$ 

如果你一直在搞IFS,那麼它的當前值可能會改變名字的解釋方式。恢復到默認值(空白,標籤,換行符):

IFS=$' \t\n'