關於shell中的trap和expr 前言實在不知道這個文章名應怎麼寫了,就隨便寫了這麼一個奇怪的名字。反正就是來講trap和expr。trap和expr是shell中的兩個命令,後面那個命令大家應該都很熟,就是進行四則運算的,而前面那個命令可能不寫shell指令碼的人不太熟。這個我下面會講到它的簡單作用。 www.2cto.com 但看到這裡,或許大家還是在奇怪我為什麼要寫這兩個命令,就是說為什麼這兩個命令會聯絡在一起,哎,這主要在於我工作時寫指令碼時遇到的一個問題。使這倆本來看起來互不相干的命令聯絡在了一起。 首先講一下trap這個命令是幹什麼用得。 traptrap是寫shell指令碼的利器,通常用trap來處理shell中的各種異常,類似於catch(try..catch)。那在講trap命令是幹什麼的之前,先講下他的文法,trap的文法是這樣的: trap [COMMANDS] [SIGNALS] 這個文法的意思就死活說,trap會捕獲在[SIGNALS]的訊號,在捕獲到訊號後,會執行COMMANDS命令。比如說,你可以讓trap捕獲SIGHUP訊號,在捕獲到相應訊號時,執行你寫的command命令。trap非常有用,不過我一般不用他捕獲訊號,而是捕獲ERR,這個ERR,就是指所有非0傳回值的shell命令的執行。因為在shell的規範中,正確執行命令後,shell的傳回值都應該是0,非0的即是沒有正確執行得。所以,捕獲所以非0返回的,就是對所有shell中未成功執行得進行相應的處理。比如,你可以這樣寫: trap echo failed ERR 這個命令就是在寫當遇到任何錯誤時,會直接執行到這一句,直接echo failed。當然你可以完善的更好些,比如把錯誤行號列印出來,這些就看你自由發揮的。所以,trap這個命令對於shell指令碼中的異常捕獲及處理非常有用。 各位可以到這個連結看下,這個連結講得還不錯http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html expr好,講完了trap,那我就來講講expr,其實expr沒什麼好講的,就是個四則運算的,這個我把命令貼出來大家就清楚了: $ expr 1 / 11 這命令就是在計算1除以1等於幾的問題。好,既然是這麼一個簡單的命令,那又是與trap怎麼關係起來的呢。我們看下面一條命令: $ expr 1 / 20 這個計算1除以2,因為expr只能搞整形的計算,所以等於0,也沒什麼問題,這個命令看起來沒任何問題,因為1除以2,確實等於0,但問題就在於這個命令的傳回值。我們可以看下 caojiandong@naruto. ~/$ expr 1 / 20caojiandong@naruto. ~/$ echo $?1 www.2cto.com 大家可以看到,這個命令的傳回值是1,而正常啟動並執行命令傳回值應該是0的。比如: caojiandong@naruto. ~/$ expr 3 / 21caojiandong@naruto. ~/$ echo $?0 至於為什麼1/2,expr的傳回值是1,這個我還沒仔細研究,因為目測結果是沒問題的,這個各位童鞋如果知道的話也勞煩指教下。 說到這裡,大家應該清楚了為什麼expr會和trap給聯絡在了一起,就是這個傳回值。我在寫指令碼的時候,就是執行了一個結果為0的expr,目測是沒問題的,結果他的傳回值為1,所以就被trap給catch住了,結果就拋異常了。。。靠,expr 1/2 這種,除數大於被除數的,結果是0的,傳回值為什麼要是1呢。。。。 nnd,後來定位了後,我就沒再用expr了,直接用$(())來給變數賦值了。 好了,文章寫完了,沒啥技術含量,不過不知道trap的可以去瞭解下,因為寫shell的時候這個命令真得很有用。 來源 http://www.log4myself.info/archives/318