多数のファイルをダウンロードするスクリプトを作成しています。特定のファイルが存在しない場合に通知するようにしたいと考えています。
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
どうしたの?
多数のファイルをダウンロードするスクリプトを作成しています。特定のファイルが存在しない場合に通知するようにしたいと考えています。
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
どうしたの?
$?
他の人は、最新の終了コードを取得するために使用できるものを正しく投稿しています:
wget_output=$(wget -q "$URL")
if [ $? -ne 0 ]; then
...
これにより、stdout と終了コードの両方をキャプチャできます。実際に何を出力するか気にしない場合は、直接テストできます。
if wget -q "$URL"; then
...
そして、出力を抑制したい場合:
if wget -q "$URL" > /dev/null; then
...
$r
wget のテキスト出力です (バッククォートでキャプチャしたもの)。戻りコードにアクセスするには、$?
変数を使用します。
$r
は空であるため、条件は単項演算子として使用されてif [ -ne 0 ]
いるように見えます。-ne
代わりにこれを試してください:
wget -q www.someurl.com
if [ $? -ne 0 ]
...
EDITアンドリューが私の前に説明したように、バッククォートは標準出力を$?
返し、最後の操作の終了コードを返します。
あなたはただできる
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] -->
私は幸運なことにすべての解決策を試してきました。
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" と入力しました。これは最善の方法ではありませんが、ソリューションのテストには問題ありませんでした。