2010-11-07 24 views
7

Tôi muốn tạo ra một file bash (sh) mà hiện những điều sau đây:wget với sản lượng errorlevel bash

tôi gọi là kịch bản như www.blabla.com/bla.jpg ./download.sh

tập lệnh phải lặp lại nếu tập tin đã tải xuống hay không ...

Làm cách nào để thực hiện việc này? Tôi biết tôi có thể sử dụng errorlevel nhưng tôi mới sử dụng linux để ...

Cảm ơn bạn trước!

Trả lời

6

Các ứng dụng thông thường trong Linux sẽ đặt giá trị của biến môi trường $? về thất bại. Bạn có thể kiểm tra mã trả lại này và xem liệu nó có cho bạn bất kỳ lỗi nào đối với wget hay không.

#!/bin/bash 
wget $1 2>/dev/null 
export RC=$? 
if [ "$RC" = "0" ]; then 
    echo $1 OK 
else 
    echo $1 FAILED 
fi 

Bạn có thể đặt tên cho tập lệnh này là download.sh. Thay đổi các quyền cho 755 với chmod 755. Gọi nó với tên của tập tin bạn muốn tải xuống. ./download.sh www.google.com

+0

Ok .. bạn có thể cung cấp cho tôi một ví dụ hay không, vì vậy khi tệp được tải xuống, tập lệnh "OK" của người khác khác "FAILED" ... – CyberK

+1

Đã thay đổi tập lệnh để OK và ĐƯỢC FAILED trong đó. Làm cho nó một ví dụ tốt hơn. – ojblass

+0

@CyberK: Bạn cũng có thể muốn loại bỏ đầu ra của bộ lọc: 'wget $ 1 2>/dev/null' – thejh

3

Bạn có thể thử một cái gì đó như:

#!/bin/sh 

[ -n $1 ] || { 
    echo "Usage: $0 [url to file to get]" >&2 
    exit 1 
} 

wget $1 

[ $? ] && { 
    echo "Could not download $1" | mail -s "Uh Oh" [email protected] 
    echo "Aww snap ..." >&2 
    exit 1 
} 

# If we're here, it downloaded successfully, and will exit with a normal status 

Khi đưa ra một kịch bản mà sẽ (có thể) được gọi bởi các kịch bản khác, điều quan trọng là phải làm như sau:

  • Đảm bảo lập luận tỉnh táo
  • Gửi e-mail, viết thư cho một bản ghi, hoặc làm điều gì đó khác để ai đó biết những gì đã xảy ra

Các >&2 chỉ đơn giản là chuyển hướng đầu ra của các thông báo lỗi để stderror, cho phép một kịch bản gọi điện thoại để làm một cái gì đó như thế này:

foo-downloader >/dev/null 2>/some/log/file.txt 

Vì nó là một wrapper ngắn, không có lý do gì để từ bỏ một chút tỉnh táo :)

này cũng cho phép bạn chọn lọc trực tiếp sản lượng của wget để /dev/null, bạn thực sự có thể muốn nhìn thấy nó khi kiểm tra, đặc biệt là nếu bạn nhận được một e-mail nói rằng nó đã thất bại :)

0

wget thực hiện trong không tương tác đường. Điều này có nghĩa là wget làm việc ở chế độ nền và bạn không thể bắt được mã trả về với $ ?.

Một giải pháp đó là để xử lý các "--server-phản ứng" bất động sản, tìm kiếm http trạng thái 200 đang Ví dụ:

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 

Lưu ý: wget cần một thời gian để hoàn thành công việc của mình, vì lý do đó tôi đặt "ngủ 5". Đây không phải là cách tốt nhất để làm nhưng làm việc ok để kiểm tra các giải pháp.

Các vấn đề liên quan