2016-02-14 82 views
2

我正在學習Bash腳本的基礎知識。如果我沒有弄錯,那麼沒有分隔符的字符串和用雙引號(")分隔的字符串幾乎是以相同的方式解釋的,所以就像字母數字字符串一樣;內部的變量被擴展。另一方面,用單引號(')分隔的字符串不會擴展變量,這是將它們與前面提到的變量進行比較的主要區別。 在終端上練習一下,我注意到一條語句不能按我的預期工作。正如你可以看到在這個例子:爲什麼不回聲「Hello World!」聲明按預期工作?

MacBook-Pro-di-Rodolfo:~ Rodolfo$ echo Hello World! 
Hello World! 
MacBook-Pro-di-Rodolfo:~ Rodolfo$ echo 'Hello World!' 
Hello World! 
MacBook-Pro-di-Rodolfo:~ Rodolfo$ echo "Hello World!" 
echo "Hello World" 
Hello World 

最後的語句不打印出相同的字符串作爲以前的,截斷的感嘆號。任何人都可以向我解釋這個角色移除的原因嗎? 如果它可以有用,我在Mac OS X v。10.9下運行所有​​這些。

+2

見http://unix.stackexchange.com/q/33339/23529 –

+0

@DanielJour,所以最優雅的解決方案,以避免這種情況是隻使用單引號,考慮到反斜槓字符DOEN」在這種情況下工作? – rudicangiotti

+1

在這裏使用轉義反斜槓有什麼問題? IIRC相鄰的字符串由bash連接起來,所以像'「Hello World」'!''也應該起作用。 –

回答

3

這是一個真正的評論:

報價,unquotes串在一個非常基本的方式不同:未加引號的字符串是受外殼進一步擴大

詞的拆分:未加引號的字符串將被標記化殼,和令牌被接合爲單個空格

text="my name is 
    Inigo Montoya" 
echo "$text" 
echo $text 

輸出

my name is 
    Inigo Montoya 
my name is Inigo Montoya 

注意空格如何被倒塌的不帶引號的版本

文件名生成:外殼名樣式(又名「水珠」模式)將在不帶引號的字符串進行擴展:

text="files *" 
echo "$text" 
echo $text 

輸出

files * 
files [list of all files in your current directory ...] 

此行爲可以用set -f和來控制


對於所有的血淋淋的細節,請閱讀bash的手冊:

而這種規範的文章:

+0

只是爲了好玩:'(IFS =''; echo $ text)'。 –

+0

你的意思是'(IFS =''; set -f; echo $ text)''echo'$ text「'。 Whee,好玩! –

+1

那麼,我真的沒有'set -f'的意思,但只是爲了說明保留了換行符和連續空格。 (當然,所有這些都是一個壞主意,只能在家長的監督下使用 - 除非我們殺死了你的父親,我們應該準備去死)。 –