2016-12-06 60 views
1

下面是我的玩具程序shell在bash下輸出多行文本?

[email protected]:~/Desktop$ foo=$'line1\nline2' 
[email protected]:~/Desktop$ echo $foo 
line1 line2 
[email protected]:~/Desktop$ echo "$foo" 
line1 
line2 

我知道在引用shell命令行語言的機制。我的期望是兩個echo命令會輸出相同的東西,因爲無論如何,美元符號都是明文和雙重qouting中的元字符。那爲什麼它不同。它是一些嵌套的分類嗎?

+1

@DevNull謝謝,我知道這種方式。我真正的問題是爲什麼echo $ foo和echo「$ foo」在這裏的行爲有所不同 – nathan

+0

啊,在查看接受的答案之後,我明白你在找什麼。好吧,很高興它自行解決。乾杯! – DevNull

回答

3

的報價,不帶引號的版本之間的差異可能取決於你的shell,但最有可能的是:

  • 報價,"$foo"代表傳遞給echo命令,打印逐字一個參數,其次換行。
  • 未加引號,$foo擴展爲由$IFS分隔的一組參數。如果$IFS未設置,則默認爲空白,如果沒有字段分隔符,則只有一個字段。

在不帶引號的版本,沒有理由期望換行符將被視爲輸出的一部分,因爲它甚至不是真正的輸入echo命令的一部分。它只是分隔論點。

如果你想改變這種行爲,你可以改變你的$IFS設置,但我不推薦它。在需要處理字段時更改IFS,而不是格式化輸出。

對於可預測的輸出,請遵循POSIX.1建議,並且根本不要使用echo。改爲使用printf

+1

使用'IFS'將輸出格式化爲帶有數組項的字段分隔符('「$ {array [*]}'')或'」$ *「'是合法的,但同樣只能在雙引號內生效。 – cdarke

+2

@ghoti非常感謝。我想你是對的。我也試過$'line1 \ tline2',這證實了你的解釋 – nathan

+1

FYI,我相信這是官方文檔。 「如果參數擴展發生在雙引號內: 不應對擴展結果執行路徑名擴展 字段拆分不得在擴展結果上執行,'@'除外;請參見特殊參數「。 – nathan