コマンドが成功または失敗した場合に条件付きで何かを行う方法

bashでこのようなことを行うにはどうすればよいですか?

if "`command` returns any error"; then echo "Returned an error" else echo "Proceed..." fi 

回答

コマンドが成功または失敗した場合に条件付きで何かを行う方法

まさにそれがbashです”s ifステートメントは次のことを行います:

if command ; then echo "Command succeeded" else echo "Command failed" fi 

コメントからの情報の追加:しないこの場合、[]構文を使用する必要があります。[はそれ自体がコマンドであり、testとほぼ同等です。おそらくifで使用する最も一般的なコマンドであり、それがシェルの構文の一部であるという仮定に。ただし、コマンドが成功したかどうかをテストする場合は、上記のように、コマンド自体をifで直接使用します。

コメント

  • セミコロンが重要であることに注意してください。
  • または、thenを別の行に配置することもできます。
  • @Joe:if ! command ; then ... ; fiのことだと思います。 [はそれ自体がコマンドであり、この場合は'は必要ありません。
  • @Joe:私のやり方また、正しいという利点もあります。 if [ ! command ]は'を実行しませんcommand; commandを文字列として扱い、長さがゼロ以外であるためtrueとして扱います。 [は、 test コマンドの同義語です
  • おっと。あなたは'正解です。

回答

小さなことについてシェルコマンドが機能する場合に実行したい場合は、&&コンストラクトを使用できます。

rm -rf somedir && trace_output "Removed the directory" 

同様にシェルコマンドが失敗したときに発生したい小さなことは、||を使用できます:

rm -rf somedir || exit_on_error "Failed to remove the directory" 

またはその両方

rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory" 

これらの構造を使用するのはおそらく賢明ではありませんが、制御の流れをより明確にすることができる場合があります。

コメント

  • 短く、(少なくとも一部のシェルでは)高速です。かつて試したこれらの条件付き構造だけで記述されたモンスターUltrixインストールスクリプトを思い出すと震えます。解読…

回答

$?、最新のコマンド/関数を実行した結果が含まれています:

#!/bin/bash echo "this will work" RESULT=$? if [ $RESULT -eq 0 ]; then echo success else echo failed fi if [ $RESULT == 0 ]; then echo success 2 else echo failed 2 fi 

コメント

  • 技術的には正しいですが(したがって、反対票を必要としません)、'はBash 'のifイディオムを使用していません。キース・トンプソン'の答えが好きです。
  • このイディオムには利点があります。戻り値が保持されます。全体として、これはより冗長ですが、より強力であることがわかります。 'も読みやすくなっています。
  • "バッシュ' s if idiom "?
  • @Nowaker ifの唯一の目的がこの。 Bashのフロー制御条件はすべて、舞台裏で$?を調べます。その'は彼らが行うことです。その値を明示的に調べることはほとんどの場合不要であり、通常は初心者のアンチパターンです。
  • 読みやすさのためにこれを好みます。メインコマンドは通常、非常に長いコマンドです。 " if "ステートメント内に配置すると、読みにくくなります。

回答

これでうまくいきました:

command && echo "OK" || echo "NOK" 

if commandが成功すると、echo "OK"が実行され、成功したため、そこで実行が停止します。それ以外の場合、&&はスキップされ、 echo "NOK"が実行されます。

コメント

  • 失敗した場合に何かを実行したい場合は、保存します。終了コード(コマンドプロンプトに表示したり、スクリプトでテストしたりするため)は、次のように実行できます。command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
  • @ Sam-Hasler:shouldn 'それはcommand && echo "OK" || (c=$?; echo "NOK"; (exit $c))ですか?
  • また、echo "OK"の部分自体が可能であれば失敗した場合、これはより良いです:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
  • @ jrw32982、ニース、私は'以前の構造を使用しました。後者ではありません。
  • 本当の答えはコメントにあります、ありがとう!

回答

if...then...fiおよび&& / ||タイプのアプローチは、テストするコマンドによって返される終了ステータスを処理します(成功した場合は0)。ただし、一部のコマンドは、コマンドが失敗した場合、または入力を処理できなかった場合に、ゼロ以外の終了ステータスを返しません。つまり、通常のifおよび&& / ||のアプローチはこれらのアプローチでは機能しません。特定のコマンド。

たとえば、Linux GNU fileは、存在しないファイルを引数として受け取り、ユーザーが指定したファイルを見つけることができませんでした。

$ find . -name "not_existing_file" $ echo $? 0 $ file ./not_existing_file ./not_existing_file: cannot open `./not_existing_file" (No such file or directory) $ echo $? 0 

このような場合、状況を処理する1つの方法は、

/ stdinメッセージ(例: fileコマンドによって返されるもの、またはfindのようにコマンドの出力を解析するもの。そのためには、caseステートメントを使用できます。

$ file ./doesntexist | while IFS= read -r output; do > case "$output" in > *"No such file or directory"*) printf "%s\n" "This will show up if failed";; > *) printf "%s\n" "This will show up if succeeded" ;; > esac > done This will show up if failed $ find . -name "doesn"texist" | if ! read IFS= out; then echo "File not found"; fi File not found 

回答

私が思いついた最もエラーが発生しやすいのは、次のとおりです。

  • まず、値を取得します。次のようなことをしたとします。

RR=$?

これで、この状況だけでなく、直面する可能性のある他の状況についても、検討:

定義変数:

$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi

回答:はい

$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi

回答:いいえ

未定義の変数:

$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi

回答:いいえ

$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi

回答:はい

$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi

回答:はい

これにより、あらゆる種類のエラーが防止されます。

おそらくすべての構文を知っていますが、ここではいくつかヒント:

  • 引用符を使用します。 "blank"nothingにすることは避けてください。
  • 変数の新しい最新の表記法は。
  • 数値の前に連結されたゼロを追加すると、「数値がまったくない」ことも回避されます。
  • ただし、ゼロを追加すると、数値はbase-87を超える数値の場合、
    • value too great for base (error token is "08")のようなエラーが発生します。そのとき、10#が機能します。
    • 10#は、番号を。

回答

次の操作を実行できます:

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then echo "ping response succsess!!!" fi 

コメント

  • これは機能しますが、複雑です。 'サブシェルのサブシェルでpingを実行している場合、pingの出力は、コマンドとして実行することを考慮してキャプチャされます。ただし、出力は/ dev / nullにリダイレクトされるため、常に空の文字列になります。したがって、'サブシェルでは何も実行していません。つまり、(コマンド置換サブシェルの)以前の終了ステータスが保持されます。明らかに、正しい方法はここでif ping ...; thenです。

回答

このスレッドの他の場所で述べたように、元の質問は基本的にそれ自体に答えます。これは、if条件もネストされる可能性があることを示す図です。

この例では、ifを使用して、ファイルが存在するかどうか、およびファイルが通常のファイルであるかどうかを確認します。これらの条件が当てはまる場合は、サイズが0より大きいかどうかを確認してください。

#!/bin/bash echo "Which error log are you checking today? " read answer if [ -f /opt/logs/$answer*.errors ] then if [ -s /opt/logs/$answer*.errors ] then echo "Content is present in the $answer error log file." else echo "No errors are present in the $answer error log file." fi else echo "$answer does not have an error log at this time." fi 

コメント

  • それはあなたの答えがすることですが、あなたの答えは質問に対処していません。
  • @JeffSchaller、あなたのメモに感謝します。質問への参照を含めるように投稿を編集しました。

回答

#!/bin/bash if command-1 ; then echo "command-1 succeeded and now running from this block command-2" command-2 else echo "command-1 failed and now running from this block command-3" command-3 fi 

コメント

回答

$?がステータスを表示するので、これはこの方法で簡単に行うことができます。

したがって

#!/bin/sh ... some command ... if [ $? == 0 ] ; then echo "<the output message you want to display>" else echo "<failure message>" fi 

コメント

  • 反対票:これは、単調であるという批判を正当に受けた以前の回答を言い換えたものです。
  • 実際、私が'しようとしているので、これはまさに私が探していたものでした。 "コマンド"を" set -e <の一部としてスクリプトに失敗させるにはdiv id = "6a9f7f7bb8">

' 'がifの一部である場合。'が反対票を投じられるべきではありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です