2017-09-02 16 views
0

私はすべてのコマンドが成功した場合には "SUCCESS"を出力し、1つのコマンドが失敗した場合にallコマンドを実行するシェルスクリプトを用意したいと思います。 FAILED "と表示されます。IF elseのシェル実行バンチ

私のシェルスクリプトコマンド:

cd /home/lin 

mkdir logs 

cp /tmp/filelog.log logs/ 

rm /tmp/log* 

touch /tmp/log 

保存これを実行している間、私のいずれかのコマンドが失敗した場合ここでは、このファイルtest.sh

は私のクエリは、

です実行を停止し、 "Failed"を印刷する必要があります

Else prin T「SUCCESS」

答えて

1

適切なスクリプトのサンプル

#!/bin/sh 

die() { echo >&2 "$0 Err: [email protected]" ; exit 1 ;} 


cd /home/lin    || die "Can't change to '/home/lin' dir" 

mkdir logs     || die "Can't create '$PWD/logs' dir" 

cp /tmp/filelog.log logs/ || die "Can't copy 'filelog.log' to '$PWD/logs'" 

rm /tmp/log*    || die "Can't remove '/tmp/log*'" 

touch /tmp/log    || die "Can't touch /tmp/log" 


echo SUCCESS: All done! 
2

各コマンドは、その前身に依存しているので、これはset -eのための完璧なユースケースです。サブシェルですべての作業を実行すると、サブシェルの結果を確認するだけで済みます。

set -eは、最初に見つかったエラーで現在のシェルを終了します。 (すなわち、ゼロ以外の終了ステータスが返されたとき。)

(set -e 
    cd /home/lin 
    mkdir logs 
    cp /tmp/filelog.log logs/ 
    rm /tmp/log* 
    touch /tmp/log 
) && echo "SUCCESS" || echo "FAILED" 
+1

透き通った:) –

+0

私はそれをテストし、それが動作しませんでしたが私のために。そして、(要件ではない)サブシェルに設定されたvariabeleは失われます。 –

0

オプションのパラメータを印刷する関数を作成します。

stop() 
{ 
    if [ $# -gt 0 ]; then 
     echo "Failed: [email protected]" 
    else 
     echo "Failed." 
    fi 
    exit 1 
} 

多くのコードを書きたくない場合は、パラメータなしでこの機能を使用できます。

cd /home/lin || stop 
mkdir logs || stop 
cp /tmp/filelog.log logs/ || stop 
rm /tmp/log* || stop 
touch /tmp/log || stop 
echo Success 

あなたはそれにもっと力を入れることができます。
最初のコマンドは、stderrをフェッチして出力に使用する方法を示しています。

errmsg=$(cd /home/lin 2>&1) || stop ${errmsg} 
# You do not want an error when the dir already exists 
mkdir -p logs || stop 
# You can test in front 
test -f /tmp/filelog.log || stop File filelog.log not found 
cp /tmp/filelog.log logs/ || stop 
rm -f /tmp/log* || stop 
touch /tmp/log || stop 
echo Success 

他の可能性はset -eを使用して(障害発生後に終了しますが、「失敗」のメッセージを持っていません)、これは@Kusalanandaと@HenkLangeveldの答えに示されています。
やコマンドのチェーンます-eerrexit)シェルオプションはシェルを終了させるときERRトラップが実行さ

#!/bin/bash 

set -e 
trap 'echo FAILED' ERR 

mkdir test/test 
# etc. 

echo 'SUCCESS' 

cd /home/lin && 
mkdir -p logs && 
test -f /tmp/filelog.log && 
cp /tmp/filelog.log logs/ && 
rm -f /tmp/log* && 
touch /tmp/log || stop 
0

bash(又はksh)のためのソリューションをコマンドがゼロ以外の終了ステータスを返すために発生します。

テストmkdir test/testが失敗したディレクトリにこのスクリプト:

bash-4.4$ bash script.sh 
mkdir: test/test: No such file or directory 
FAILED 

テストmkdir test/testが成功したディレクトリにこのスクリプト:

bash-4.4$ bash script.sh 
SUCCESS 
関連する問題