bash script: คำสั่ง repeat ถ้ามันส่งกลับข้อผิดพลาด


23

ฉันต้องการสร้างการวนซ้ำที่ทำซ้ำการถ่ายโอน ncftp หากส่งคืนข้อผิดพลาด

ฉันไม่แน่ใจเล็กน้อยว่าจะสามารถใช้ตัวแปรรหัสทางออกในการวนซ้ำได้อย่างไร อยากได้สิ่งนี้ไหม

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

คำตอบ:


40

ฉันพบพื้นฐานสำหรับลูปสุดหรูนี้ที่อื่นบนเซิร์ฟเวอร์ผิดพลาด ปรากฎว่าไม่จำเป็นต้องบันทึกรหัสออกในขณะที่คุณสามารถทดสอบโดยตรงกับคำสั่งนั้น

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

เกือบจะ คุณน่าจะบันทึกค่าส่งคืนเป็นตัวแปรได้ดีขึ้นเพื่อให้คุณสามารถตั้งค่าไว้ล่วงหน้าก่อนลูป มิฉะนั้นจะได้รับผลกระทบจากคำสั่งเรียกใช้ล่าสุด

คุณอาจต้องการที่จะเหวี่ยงsleepมันเพื่อหยุดการตอบสนองเร็วเกินไป

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

ฉันคิดว่าลืมส่งรหัสทางออกไปยังตัวแปร RET แต่ฉันเข้าใจแล้ว คำถามหลักของฉันคือเมื่อไหร่จนกว่าจะมีการประเมินข้อ? ใน C จะไม่ได้รับการประเมินจนกว่าหลังจากการเรียกใช้ลูปแรกในกรณีนี้ลูปของฉันควรทำงาน ของคุณยังดีกว่าแม้ว่ามันจะช่วยให้คำสั่งกลางเช่นการนอนหลับ ขอบคุณ!
รอย

เห็นดี ฉันแก้ไขมันแล้ว ข้อจะถูกประเมินก่อนที่จะเรียกใช้ครั้งแรก ดังนั้นก่อนหน้านี้มันจะใช้รหัสส่งคืนของคำสั่งก่อนหน้าใด ๆ Bash นั้นไม่ได้ถูกบังคับใช้สองครั้ง แต่เป็นการใช้งานที่ดี
Dan Carley

== สำหรับสตริงเท่าเทียมกันไม่ใช่ตัวเลข แต่ฉันไม่คิดว่ามันเป็นเรื่องสำคัญในกรณีนี้ ...
ไคล์ Brandt

เท่ากับและสองเท่ากัน แต่มันจะเป็นการดีกว่าถ้าคุณใช้ความเสมอภาคจำนวนเต็มตอนนี้เมื่อคุณพูดถึงมัน
Dan Carley

1
คุณไม่จำเป็นต้องทดสอบหมายเลขรหัสส่งคืน - คุณสามารถทดสอบรหัสส่งคืนของโปรแกรมเองได้จนกว่าจะถึงโปรแกรม นอนหลับ 3 เสร็จแล้ว
chris

3

บิตแฮ็ค แต่โซลูชันของฉันคือเพียงแค่สร้างฟังก์ชั่นทุบตีซึ่งทำงานตัวเองถ้ามันออกมาพร้อมกับความล้มเหลว

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

0

คุณสามารถวนซ้ำในขณะที่คำสั่งของคุณส่งคืนข้อผิดพลาด:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

3
คำตอบนี้ต้องการคำอธิบาย
kasperd

@kasperd เพิ่มคำอธิบายแล้ว
Andrés Rivas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.