2014-08-28 27 views
1

爲什麼這些做不同的事情?Shell腳本:回聲vs保存到變量

ENTRY="banana#Apple" 

HOST_ID=$ENTRY | awk -F '#' '{print $2}' 
echo $HOST_ID 

echo $ENTRY | awk -F '#' '{print $2}' 

在echo命令中,數據按預期顯示。在保存到變量命令中,數據不是,變量留空。

+1

您需要告訴shell您的'HOST_ID = ...'版本是否打算執行命令。只是把一些命令式的文本放在那裏是不夠的。 ''var = $(command here)''''''var'''''' – 2014-08-28 18:19:10

+1

如果你提到你正在使用哪個shell的話,它很有幫助,儘管這裏的答案中的技術往往適用於bourne-鍵入shell:'bash','sh','zsh','dash'。 – 2014-08-28 18:27:22

回答

2

此:

HOST_ID=$ENTRY | awk -F '#' '{print $2}' 

含義:

HOST_ID='banana#Apple' | awk -F '#' '{print $2}' 

換句話說,你在不同的子shell — HOST_ID='banana#Apple'awk -F '#' '{print $2}' —和管道之一的輸出到正在運行的兩個命令其他。這不會完成任何事情:HOST_ID='banana#Apple'不產生任何輸出,因此awk命令沒有輸入,因此它不會打印任何內容。 (而且由於外層以內,甚至HOST_ID='banana#Apple'部分沒有任何影響:它設置變量在子shell,而不是在正在運行的總體命令父shell這樣的價值幾乎立即消失。)


相反,你想寫:

HOST_ID="$(echo "$ENTRY" | awk -F '#' '{print $2}') 

或:

HOST_ID="$(awk -F '#' '{print $2}' <<< "$ENTRY") 

或者可能(如果你只是總是期望$ENTRY有TW o域):

HOST_ID="${ENTRY#*#}"