Bash:command1が失敗した場合、command2を実行します


43

私はこのようなことをしたい:

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

どうすればいいですか?


1
「エコー成功」コマンドの前に「then」キーワードが欠落しています。
グレンジャックマン

10
うーん。あなたの擬似コードは.....あなたのタイトルに1とは異なる質問をするように見える
mattdm

いくつかのシェルスクリプトの終了条件に適した
フラッシュマン

回答:


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。私は、あなたが「最初のエコーコマンドの出力を見ていない」ことで意味を把握カント
erm3nda

@mlissnerあなたの質問を受け取ったと思いますが、答えはechoコマンドが決して失敗しないということです。つまり、戻り値は0、つまり真実になります。本当に重要条件はただであるのでcmd1 && cmd2
カズムよりたくさんの

22

Petr Uzelはその場にいますが、魔法の$?で遊ぶこともできます。

$?最後に実行されたコマンドの終了コードを保持します。これを使用すると、非常に柔軟にスクリプトを作成できます。

この質問は、このトピックに少し触れています。$を使用するベストプラクティスですか。バッシュで?

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

その後、異なる終了コードに反応して、必要に応じて異なることを行うこともできます。


1
私の会社であるPHP Experts、Inc.と私は、内部CIスクリプトの不可欠な部分であることを感謝します。ありがとうございました!
セオドアR.スミス

7

質問の擬似コードは、質問のタイトルに対応していません。

コマンド1が失敗した場合に誰かがコマンド2の実行方法を実際に知る必要がある場合、これは簡単な説明です。

  • cmd1 || cmd2:これは実行されcmd1、失敗した場合は実行されますcmd2
  • cmd1 && cmd2:これは実行されcmd1、成功した場合は実行されますcmd2
  • cmd1 ; cmd2:これは実行されcmd1、実行cmd2の失敗または成功とは無関係に実行されcmd1ます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.