Проверить возвращаемое значение wget

Я пишу скрипт для загрузки набора файлов и хочу, чтобы он сообщал, когда определенный файл не существует.

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

Что случилось?


person Igor    schedule 26.04.2010    source источник


Ответы (6)


$r — это текстовый вывод wget (который вы записали обратными кавычками). Для доступа к коду возврата используйте переменную $?.

person nobody    schedule 26.04.2010
comment
Хотя это правильно, лучшим объяснением было бы, почему $r пусто и почему появляется сообщение об ошибке. - person Engineer2021; 03.04.2014

Другие правильно написали, что вы можете использовать $? для получения самого последнего кода выхода:

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

Это позволяет вам захватить как стандартный вывод, так и код выхода. Если вам на самом деле все равно, что он печатает, вы можете просто протестировать его напрямую:

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

И если вы хотите подавить вывод:

if wget -q "$URL" > /dev/null; then
    ...
person Cascabel    schedule 26.04.2010
comment
Стандартно ли, что if получит код выхода программы при использовании этой формы? (if <program>; then...) - person Vassilis; 08.11.2013

$r пусто, и поэтому ваше условие становится if [ -ne 0 ] и кажется, что -ne используется как унарный оператор. Попробуйте это вместо этого:

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

EDIT Как объяснил Эндрю, обратные кавычки возвращают стандартный вывод, а $? возвращает код выхода последней операции.

person Bolo    schedule 26.04.2010
comment
это единственный ответ, который объясняет, почему спрашивающий получает это сообщение об ошибке. +1. - person lesmana; 03.01.2013

ты мог бы просто

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] --> 
person kSiR    schedule 27.04.2010
comment
Код только ответ не рекомендуется. Пожалуйста, напишите какое-нибудь объяснение того, как это работает? - person foobar; 29.11.2019

Лучший способ получить результат от wget, а также проверить статус вызова

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

Таким образом, вы можете проверить состояние wget, а также сохранить выходные данные.

  1. Если вызов успешен, используйте сохраненный вывод

  2. В противном случае он выйдет с ошибкой wget failed

person Anshul Sharma    schedule 24.08.2016

Я пробовал все решения без везения.

wget выполняется в неинтерактивном режиме. Это означает, что wget работает в фоновом режиме, и вы не можете перехватить код возврата с помощью $?.

Одним из решений является обработка свойства --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. Это не лучший способ сделать, но сработало нормально для проверки решения.

person kazzikazzi    schedule 21.01.2015