web-dev-qa-db-ja.com

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

どうしましたか?

32
Igor

$rは、wgetのテキスト出力です(バックティックでキャプチャしました)。戻りコードにアクセスするには、$?変数を使用します。

38
Andrew Medico

他のユーザーは、$?最新の終了コードを取得するには:

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

これにより、stdoutと終了コードの両方をキャプチャできます。実際に何を印刷するか気にしない場合は、直接テストできます。

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

そして、出力を抑制したい場合:

if wget -q "$URL" > /dev/null; then
    ...
64
Cascabel

$rは空なので、条件はif [ -ne 0 ]そして、それは-neは単項演算子として使用されます。代わりにこれを試してください:

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

[〜#〜] edit [〜#〜]アンドリューが説明したように、バックティックは標準出力を返しますが、$?は、最後の操作の終了コードを返します。

13
Bolo

あなたはただ

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

-(~)----------------------------------------------------------(07:30 Tue Apr 27)
risk@DockMaster [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)
risk@DockMaster [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)
risk@DockMaster [2026] --> 
10
kSiR

私は幸運なくすべてのソリューションを試していました。

wgetは非対話的な方法で実行されます。これは、wgetがバックグラウンドで動作し、$?で戻りコードをキャッチできないことを意味します。

1つの解決策は、 "-server-response"プロパティを処理し、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が作業を完了するには時間が必要です。そのため、「sleep 5」を設定します。これは最善の方法ではありませんが、ソリューションのテストでは問題なく動作しました。

2
kazzikazzi

Wgetから結果をキャプチャし、通話ステータスを確認する最良の方法

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

これにより、wgetのステータスを確認したり、出力データを保存したりできます。

  1. 呼び出しが成功した場合、保存された出力を使用します

  2. それ以外の場合は、エラーwget failedで終了します

0
Anshul Sharma