Bash: run command2 หาก command1 ล้มเหลว


43

ฉันต้องการทำสิ่งนี้:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

ฉันควรทำอย่างไร


1
คุณเพิ่งจะขาดคำสำคัญ "แล้ว" ก่อนคำสั่ง "echo success"
เกล็นแจ็คแมน

10
อืมม; pseudocode ของคุณดูเหมือนจะถามคำถามที่แตกต่างจากคำถามในชื่อของคุณ .....
mattdm

ทรัพยากรที่ดีสำหรับบางเงื่อนไขเชลล์สคริปต์ทางออกpixelbeat.org/programming/shell_script_mistakes.html
Flashman

คำตอบ:


71

สิ่งเหล่านี้ควรทำในสิ่งที่คุณต้องการ:

cmd1 && cmd2 && echo success || echo epic fail

หรือ

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi

3
ใช้งานได้ แต่ฉันสับสนว่าทำไม||ไม่ดูผลลัพธ์ของechoคำสั่งแรก
mlissner

1
@mlissner, if else คาดว่าจะออกรหัส 0 ถ้าคำสั่งที่เปิดตัวและ 1 หากข้อผิดพลาด อย่าอ่านที่เอาต์พุต และตอนนี้Just try whoami && whoami && echo success || echo epic fail whoami && whoareyou && echo success || echo epic failฉันลาดเทคิดออกว่าคุณหมายถึง "ไม่ได้มองไปที่การส่งออกของคำสั่ง echo แรก"
erm3nda

@mlissner ฉันคิดว่าฉันได้รับคำถามของคุณ แต่คำตอบคือคำสั่ง echo จะไม่ล้มเหลว นั่นคือผลตอบแทนจะเป็น 0 คือความจริง ดังนั้นเงื่อนไขที่สำคัญจริงๆก็คือcmd1 && cmd2
Kazim Zaidi

22

Petr Uzel เป็นจุดบน แต่คุณยังสามารถเล่นกับเวทมนตร์ $?

$? เก็บรหัสทางออกจากคำสั่งสุดท้ายที่ดำเนินการและถ้าคุณใช้สิ่งนี้คุณสามารถเขียนสคริปต์ของคุณค่อนข้างยืดหยุ่น

คำถามนี้สัมผัสกับหัวข้อนี้เล็กน้อยแนวทางที่ดีที่สุดในการใช้ $ ในทุบตี? .

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

จากนั้นคุณสามารถโต้ตอบกับรหัสทางออกที่แตกต่างกันและทำสิ่งต่าง ๆ ได้หากคุณต้องการ


1
บริษัท PHP Experts, Inc. และฉันขอขอบคุณที่เป็นส่วนสำคัญของสคริปต์ CI ภายในของเรา ขอขอบคุณ!
Theodore R. Smith

7

รหัสหลอกในคำถามไม่ตรงกับชื่อของคำถาม

หากใครต้องการรู้วิธีเรียกใช้คำสั่ง 2 หากคำสั่ง 1 ล้มเหลวนี่เป็นคำอธิบายง่ายๆ:

  • cmd1 || cmd2: สิ่งนี้จะทำงานcmd1และในกรณีที่ล้มเหลวมันจะทำงานcmd2
  • cmd1 && cmd2: สิ่งนี้จะทำงานcmd1และในกรณีที่ประสบความสำเร็จมันจะทำงานcmd2
  • cmd1 ; cmd2: นี้จะทำงานcmd1แล้วมันจะทำงานเป็นอิสระจากความล้มเหลวหรือความสำเร็จของการทำงานcmd2cmd1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.