2010-04-26 64 views
27

我正在編寫腳本來下載一堆文件,並且我希望它在特定文件不存在時進行通知。檢查wget的返回值[if]

r=`wget -q www.someurl.com` 
if [ $r -ne 0 ] 
    then echo "Not there" 
    else echo "OK" 
fi 

但它給上執行了以下錯誤:

./file: line 2: [: -ne: unary operator expected

有什麼不對?

回答

34

$r是wget(您用反引號捕獲的)的文本輸出。要訪問返回碼,請使用$?變量。

+0

這是正確的方法。 – kSiR 2010-04-27 12:28:06

+1

雖然這是正確的,但更好的解釋是爲什麼'$ r'是空的,爲什麼會出現錯誤信息。 – Brian 2014-04-03 12:06:41

10

$r爲空,因此您的條件變爲if [ -ne 0 ],並且好像-ne被用作一元運算符。試試這個:

wget -q www.someurl.com 
if [ $? -ne 0 ] 
    ... 

編輯安德魯我之前解釋的,反引號返回標準輸出,而$?返回上次操作的退出代碼。

+2

這是唯一的答案,它解釋了提問者爲什麼會收到錯誤消息。 +1。 – lesmana 2013-01-02 21:25:07

53

其他人正確地貼,你可以用$?來獲得最新的退出代碼:

wget_output=$(wget -q "$URL") 
if [ $? -ne 0 ]; then 
    ... 

這使您可以同時捕獲標準輸出和退出代碼。如果你不真正關心它所打印的,你可以直接測試它:

if wget -q "$URL"; then 
    ... 

如果你想抑制輸出:

if wget -q "$URL" > /dev/null; then 
    ... 
+4

感謝您接受所接受的答案。 – colgur 2013-03-29 23:48:11

+0

當這個表單被使用時,if是否會得到程序的退出代碼是否是標準的? ('如果;那麼...') – Vassilis 2013-11-08 16:53:33

9

你可以只

wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure" 

-(~)----------------------------------------------------------(07:30 Tue Apr 27) 
[email protected] [2024] --> wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure" 
--2010-04-27 07:30:56-- http://ruffingthewitness.com/ 
Resolving ruffingthewitness.com... 69.56.251.239 
Connecting to ruffingthewitness.com|69.56.251.239|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: unspecified [text/html] 
Saving to: `index.html.1' 

    [ <=>                     ] 14,252  72.7K/s in 0.2s  

2010-04-27 07:30:58 (72.7 KB/s) - `index.html.1' saved [14252] 

WE GOT IT 
-(~)-----------------------------------------------------------------------------------------------------------(07:30 Tue Apr 27) 
[email protected] [2025] --> wget ruffingthewitness.biz && echo "WE GOT IT" || echo "Failure" 
--2010-04-27 07:31:05-- http://ruffingthewitness.biz/ 
Resolving ruffingthewitness.biz... failed: Name or service not known. 
wget: unable to resolve host address `ruffingthewitness.biz' 
zsh: exit 1  wget ruffingthewitness.biz 
Failure 
-(~)-----------------------------------------------------------------------------------------------------------(07:31 Tue Apr 27) 
[email protected] [2026] --> 
+0

非常聰明!我建議在命令行響應中添加'-q' – insign 2015-11-13 17:58:42

1

我一直在嘗試所有的解決方案,但沒有幸運。

wget以非交互方式執行。這意味着wget在後臺工作,並且無法使用$?捕獲返回代碼。

一個解決辦法是處理「--server響應」屬性,搜索HTTP 200狀態碼 例如:

wget --server-response -q -o wgetOut http://www.someurl.com 
sleep 5 
_wgetHttpCode=`cat wgetOut | gawk '/HTTP/{ print $2 }'` 
if [ "$_wgetHttpCode" != "200" ]; then 
    echo "[Error] `cat wgetOut`" 
fi 

注:wget的需要一些時間來完成他的工作,因爲這個原因,我把「睡5」。這不是最好的方法,但可以用來測試解決方案。捕捉從wget的成果,並查看呼叫狀態

wget -O filename URL 
if [[ $? -ne 0 ]]; then 
    echo "wget failed" 
    exit 1; 
fi 

這樣,您就可以檢查的wget的狀態以及存儲輸出數據

0

的最佳方式。

  1. 如果調用成功使用輸出存儲

  2. 否則會出錯wget的退出失敗