2011-12-06 265 views
10

有人可以解釋一下這段代碼的意思嗎?請解釋這段代碼

我相信,第二行是「如果退出狀態是零」,然後回聲「有效的命令」,但我不明白的第一行

[email protected] &>/dev/null 
if [[ $? = 0 ]] 
then 
    echo "Valid command" 
fi 

回答

2

我想補充一點,這是不必要的冗長,而且可以縮短爲

if "[email protected]" &>/dev/null 
then 
    echo "Valid command" 
fi 

,甚至更短的

"[email protected]" &>/dev/null && echo "Valid command" 
7

第一行運行簡單地使用形成的所有命令參數傳遞給腳本,並將輸出重定向到/ dev/null,這本質上拋棄了它。

內置變量[email protected]擴展爲所有位置參數,每個參數都是帶引號的字符串,即參數完整地傳遞,沒有解釋或擴展。爲了達到這個效果,我相信你需要引用這個變量的用法,例如"[email protected]"

運營商&>重定向stdout和stderr。

+1

只是爲了支持:解釋這裏找到:HTTP:// TLDP .org/LDP/abs/html/internalvariables.html#APPREF – Yuri

+0

我認爲'$ *'和'$ @'只有用雙引號包圍時纔會有所不同。 – mkb

+1

@mkb:你說得對。我擔心@unwind不是:沒有指定'「$ @」',這些參數會得到空格分割,即 'function TT(){$ @; }; TT ls 1 2'3 4'' – choroba

4

根據manual[email protected]擴展到位置參數,從1開始。如果您將此腳本稱爲scripty.sh ls /,則它將執行ls /,同時將所有輸出重定向到位桶。這應該返回成功(我希望!),因此腳本將打印Valid command。如果您將其稱爲scripty.sh ls /some/nonexistent/directory,則ls命令應該失敗,並且腳本將不輸出任何內容。

實際上,我認爲腳本可以改進爲在[email protected]左右加上雙引號,以便在它們中包含空格的參數不會影響解釋器。

使用[email protected]命令ls "/Library/Application Support"擴展爲三個字。隨着"[email protected]"它擴大到兩個,並且命令運行就像沒有腳本包裝它一樣。