2011-07-26 245 views
2

爲什麼我看到的每個示例都有while IFS= read line而不是while IFS=; read line其中是'while IFS = read line`記錄的語法?

我以爲name=value command可能會設置一個本地變量,但sentence="hello" echo $sentence不起作用,而sentence="hello"; echo $sentence呢。

回答

10

的:

name=value command 

語法設置namevaluecommand。在你的例子中:

$ sentence="hello" echo $sentence 

$語句被調用shell擴展,它看不到設置。如果你

$ sentence="hello" sh -c 'echo $sentence' 

(注意單引號都被稱爲殼擴大了$),它會呼應hello。如果你嘗試

$ sentence="hello"; sh -c 'echo $sentence' 

也不會迴應任何事情,因爲sentence在當前shell設置,但不被叫之一,因爲它並沒有出口。所以

IFS=; read line 

的工作,因爲read看到IFS設置。

+0

微妙。謝謝! – nachocab

+1

+1很好的解釋 –

5

爲參數賦值命令添加前綴會影響正在執行的命令的環境

man bash

任何簡單的命令或功能的環境可以被 通過與參數分配前綴它,如在參數描述 上述 增強 暫時。這些賦值語句僅影響該命令看到的 環境。

在您的例子:sentence="hello" echo $sentencesentence將在echo命令的環境(試試這個展現自己:sentence=HI env | fgrep sentence),但不是在您從中調用它的外殼,這將需要通過當您嘗試時,它作爲echo的參數。

相關問題