Bash: jalankan command2 jika command1 gagal

43

Saya ingin melakukan sesuatu seperti ini:

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

Bagaimana saya harus melakukannya?

michelemarcon
sumber
1
Anda baru saja melewatkan kata kunci "lalu" sebelum perintah "sukses gema".
glenn jackman
10
Hmmm; pseudocode Anda tampaknya mengajukan pertanyaan yang berbeda dari yang ada di judul Anda .....
mattdm
Sumber yang bagus untuk beberapa kondisi keluar scripting shell pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Jawaban:

71

Ini harus melakukan apa yang Anda butuhkan:

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

atau

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
sumber
3
Ini berfungsi, tapi saya bingung mengapa ||tidak melihat output dari echoperintah pertama .
mlissner
1
@mlissner, if if mengharapkan untuk keluar dari kode, 0 jika perintah mana diluncurkan dan 1 jika ada kesalahan. Jangan membaca di output. Just try whoami && whoami && echo success || echo epic faildan sekarang whoami && whoareyou && echo success || echo epic fail. Saya tidak tahu apa yang Anda maksud dengan "tidak melihat output dari perintah gema pertama"
erm3nda
@ mlissner Saya pikir saya punya pertanyaan Anda, tetapi jawabannya adalah bahwa perintah gema tidak akan pernah gagal. Artinya, pengembaliannya adalah 0, yaitu benar. Jadi kondisi yang benar-benar penting hanyalahcmd1 && cmd2
Kazim Zaidi
22

Petr Uzel sangat cocok tetapi Anda juga bisa bermain dengan sihir $ ?.

$? memegang kode keluar dari perintah terakhir yang dijalankan, dan jika Anda menggunakan ini, Anda dapat menulis skrip Anda cukup fleksibel.

Pertanyaan ini sedikit menyentuh topik ini, Praktik terbaik untuk menggunakan $? di bash? .

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

Kemudian Anda juga dapat bereaksi terhadap kode keluar yang berbeda dan melakukan hal-hal yang berbeda jika Anda suka.

Johan
sumber
1
Perusahaan saya, PHP Experts, Inc., dan saya sendiri ingin mengucapkan terima kasih karena telah menjadi bagian integral dari skrip CI internal kami. Terima kasih!
Theodore R. Smith
7

Kode semu dalam pertanyaan tidak sesuai dengan judul pertanyaan.

Jika ada yang perlu benar-benar tahu cara menjalankan perintah 2 jika perintah 1 gagal, ini adalah penjelasan sederhana:

  • cmd1 || cmd2: Ini akan berjalan cmd1, dan jika terjadi kegagalan akan berjalancmd2
  • cmd1 && cmd2: Ini akan berjalan cmd1, dan jika berhasil akan berjalancmd2
  • cmd1 ; cmd2: Ini akan berjalan cmd1, dan kemudian akan berjalan cmd2, terlepas dari kegagalan atau keberhasilan menjalankan cmd1.
Orlando Rivera Letelier
sumber