2017-12-02 125 views
1

我是bash的初學者,所以如果這是一個基本問題或有語法問題,但我無法在任何地方找到答案,我表示歉意。我想運行一個命令,如果失敗,請檢查錯誤消息是否與某個字符串匹配。這是我有:僅在bash中存儲錯誤消息

err_msg=`./command input.txt 2>&1` 
if [$? -eq 1] 
then 
    if [err_msg -eq "Error: timeout"] 
    then 
     #do something 
    fi 
fi 

這是正確的方法來做到這一點?如果我使用第一行來定義錯誤消息err_msg,那麼$?仍然存儲命令的通過/失敗狀態?另外,如果命令通過會發生什麼? err_msg會是空白嗎?

+0

你有一些語法錯誤:1,留出空間周圍的字符'['和']':這些都是內建的,需要有一個空間周圍的空間被認可。 2.不要使用-eq來測試字符串是否相等。改用'='。回覆。你的問題:是的,'$?'將擴展到命令的返回碼。 –

+0

謝謝!另外,如果err_msg是第二個if語句中的$ err_msg,因爲它是一個變量? –

+0

是的,當然,你想檢查'err_msg'的擴展。您還需要_quote_這個擴展:''$ err_msg「',除非您使用更強大的關鍵字'[[''。 –

回答

0
  • 不要使用命令替換的舊式反引號形式,使用$(command)代替
  • 使用[[ ]]進行測試,而不是[ ]因爲它有more features and fewer surprises
  • -eq用於整數比較。對於字符串比較,使用===
  • 注意命令可能失敗,退出狀態等比1,因此是更好的測試非零狀態:! [[ $? -eq 0 ]]
  • 可以使用$?測試退出最後一個命令的狀態,或者你可以直接if測試:if command; then echo CMD OK; fi
  • 您可以將命令的輸出到一個變量,而測試它的退出代碼

使用上述幾點,你可以重寫你的代碼是這樣的:

if ! err_msg=$(./command input.txt 2>&1) 
then 
    if [[ $err_msg = "Error: timeout" ]]; then 
     echo "Doing something.." 
    fi 
fi 
+0

你也可以用'! err_msg = $(...)&& [[$ err_msg =「...」]]'以避免嵌套的if語句。 – chepner

+0

@chepner正是。但是,我發現對於初學者來說有點太混亂了。 – PesaThe