コマンドが成功または失敗した場合に条件付きで操作を実行する方法

コマンドが成功または失敗した場合に条件付きで操作を実行する方法

Bashでどのようにこれを行うことができますか?

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

答え1

コマンドが成功または失敗した場合に条件付きで操作を実行する方法

これが bashif文が何をするのかです。

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

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

答え2

シェルコマンドが機能しているときに発生したい小さな作業の場合は、次の設定を&&使用できます。

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"

このような構造であまりにも多くのことを行うことは賢明ではないかもしれませんが、時には制御フローをより明確にすることができます。

答え3

$?最新のコマンド/関数の実行結果を含むselected値:

#!/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

答え4

if...then...fiおよび&&/メソッドタイプは、||テストしたいコマンドによって返された終了ステータス(成功時0)を処理しますが、コマンドによって失敗した場合や入力を処理できない場合は、ゼロ以外の終了ステータスを返しません。これは、一般的なメソッドifおよび&&/||メソッドがこれらの特定のコマンドでは機能しないことを意味します。

たとえば、Linuxでは、fileGNUは存在しないファイルを引数として受け取り、指定したfindファイルが見つからない場合でも0で終了します。

$ 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つは、コマンドから返されたメッセージなどのメッセージをstderr読み取るか、コマンドの出力を解析することです。この目的のためにステートメントを使用できます。stdinfilefindcase

$ 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

関連情報