2015-04-07 151 views
1

我看到這樣的代碼:

fqdn='computer1.daveeddy.com' 

IFS=. read hostname domain tld <<< "$fqdn" 
echo "$hostname is in $domain.$tld" 
# => "computer1 is in daveeddy.com" 

我認爲它的工作原理,因爲IFS在第三行分配給. ..所以我嘗試這樣:

x=100 echo $x 

卻發現bash的不打印任何東西,而我希望它會打印100 ..

而且,我發現x=100 echo $x; echo $x打印什麼,而x=100; echo $x打印100,這很混亂。

有沒有人有關於此的想法?

回答

4

$x的膨脹之前echo運行,並將結果傳遞給echo作爲參數。 echo在其環境中不使用值x

在第一個示例中,read在其環境中使用IFS的值來拆分它通過here字符串接收到的字符串。

+1

感謝,但是爲什麼'X = 100回聲$ X; echo $ x'什麼都不打印,而'x = 100; echo $ x'打印'100'? –

+0

因爲您聲明x的值爲「100 echo $ x」 - 與「100」不同。在這種情況下,您在聲明x之前引用了x,因此爲空。分號告訴shell將命令視爲多個命令而不是一個命令。它將命令分開,就像將它們放在單獨的行中一樣。 – asimovwasright

+0

@asimovwasright不,他*不*指定'100 echo $ x'爲'x'的值。他的第一個例子只有兩個單獨的'echo'命令,這兩個命令都是在'x'沒有值的環境中執行的。第一個前命令修飾符不會被'echo'使用。第二個例子有一個常規的賦值,在下一個命令打印該值之前將shell變量'x'設置爲100。 – chepner

0

這裏是另一種方式來想一想:

$ a="echo 100" $a 
$ a="echo 100" 
$ $a 
100 
+0

請注意,第二行是不必要的。當$ a擴展爲第一行的空字符串時,結果是一個有效的賦值語句,而不是空語句的預命令修飾符,因此當前shell有一個變量'a',其值爲'echo 100'。 – chepner