Bash: chạy lệnh2 nếu lệnh1 thất bại


43

Tôi muốn làm một cái gì đó như thế này:

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

Tôi nên làm thế nào?


1
Bạn chỉ thiếu từ khóa "rồi" trước lệnh "echo thành công".
glenn jackman

10
Hừm; mã giả của bạn dường như hỏi một câu hỏi khác với câu hỏi trong tiêu đề của bạn .....
mattdm

Tài nguyên tốt cho một số điều kiện thoát khỏi kịch bản shell pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Câu trả lời:


71

Chúng nên làm những gì bạn cần:

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

hoặc là

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

3
Điều này hoạt động, nhưng tôi bối rối tại sao ||không nhìn vào đầu ra của echolệnh đầu tiên .
mlissner

1
@mlissner, if if dự kiến ​​sẽ thoát mã, 0 nếu lệnh được khởi chạy và 1 nếu có lỗi. Không đọc ở đầu ra. Just try whoami && whoami && echo success || echo epic failvà bây giờ whoami && whoareyou && echo success || echo epic fail. Tôi không thể hiểu ý của bạn là gì "không nhìn vào đầu ra của lệnh echo đầu tiên"
erm3nda

@mlissner Tôi nghĩ rằng tôi đã nhận được câu hỏi của bạn, nhưng câu trả lời là lệnh echo sẽ không bao giờ thất bại. Đó là, lợi nhuận của nó sẽ là 0, tức là sự thật. Vì vậy, điều kiện thực sự quan trọng chỉ làcmd1 && cmd2
Kazim Zaidi

22

Petr Uzel được phát hiện nhưng bạn cũng có thể chơi với phép thuật $?.

$? giữ mã thoát khỏi lệnh cuối cùng được thực thi và nếu bạn sử dụng mã này, bạn có thể viết các tập lệnh của mình khá linh hoạt.

Câu hỏi này chạm vào chủ đề này một chút, Thực hành tốt nhất để sử dụng $? trong bash? .

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

Sau đó, bạn cũng có thể phản ứng với các mã thoát khác nhau và làm những việc khác nhau nếu bạn muốn.


1
Công ty của tôi, PHP Experts, Inc., và bản thân tôi muốn cảm ơn bạn vì đã là một phần không thể thiếu của tập lệnh CI nội bộ của chúng tôi. Cảm ơn bạn!
Theodore R. Smith

7

Mã giả trong câu hỏi không tương ứng với tiêu đề của câu hỏi.

Nếu bất cứ ai cần thực sự biết cách chạy lệnh 2 nếu lệnh 1 thất bại, đây là một lời giải thích đơn giản:

  • cmd1 || cmd2: Điều này sẽ chạy cmd1, và trong trường hợp thất bại, nó sẽ chạycmd2
  • cmd1 && cmd2: Điều này sẽ chạy cmd1, và trong trường hợp thành công, nó sẽ chạycmd2
  • cmd1 ; cmd2: Điều này sẽ chạy cmd1, và sau đó nó sẽ chạy cmd2, độc lập với sự thất bại hoặc thành công của việc chạy cmd1.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.