2016-06-01 24 views
1

我試圖創建和使用中這樣的定界符變量,定界符不帶引號不是擴大參數

#!bin/bash 
sudo su - postgres <<EOF 
IP="XYZ" 
echo "$IP" 
EOF 

這不工作的權利,我得到一個空行回聲。 但是,如果我周圍使用EOF這樣,

#!bin/bash 
sudo su - postgres <<"EOF" 
IP="XYZ" 
echo "$IP" 
EOF 

它的工作原理報價。有人可以解釋這個嗎?根據我在man中讀到的內容,行爲應該是相反的。

+0

你的每個命令的輸出是什麼?在第一個變量將被擴大,在第二個變量不會。此外,該變量從不設置,因爲它只是看作一個字符串。 – 123

+0

請注意,問題實際上是問題描述的反面:這裏的doc沒有引號_is_擴展參數! –

+0

正如我所提到的那樣,唯一的輸出是'echo',它在第一個輸出中有一個空行,在第二個輸出中輸出正確的輸出,即'XYZ'。 – wolfsgang

回答

6

shell會評估此處未加引號的文檔,並在將其傳遞給命令(在您的情況下爲sudo)之前執行變量插值。因爲IP不是父shell中定義的變量,所以它會擴展爲空字符串。

使用引號,可以防止父shell執行變量插值,因此運行sudo的shell將查看並展開該變量。

+0

哦,很酷,我把'IP'移出了heredoc而沒有引號,並試圖訪問它,它按照預期工作。感謝我現在得到它。 – wolfsgang

+1

同樣要添加@wolfsgang,如果你想有選擇地從父shell中擴展一些變量,並且在heredoc中定義了一些變量(在這種情況下是'IP'),你可以用'\ IP'轉義'$'保持'EOF'字不加引號。 – anishsane

+0

@anishsane,謝謝你的提示,這非常有幫助。絕對會記住這一點。 – wolfsgang