シャットダウンがシェルスクリプトで機能しない

シャットダウンがシェルスクリプトで機能しない

シェルスクリプトには、データベースがオフラインのときに早く終了するための次のコードがあります。

Br3trans -u / -c -f dbstate && ( echo Datenbank ist online. ; echo Nächster Schritt... ) || ( echo "Datenbank ist offline" ; exit 1 );
echo Test

データベースがオフラインの場合、スクリプトを終了するのではなく「test」と表示されます。

どんなアイデアがありますか?

答え1

このexitステートメントはサブシェルを終了します。

1行のテキストを展開すると、期待どおりに機能し始めます。

#!/bin/bash
if Br3trans -u / -c -f dbstate
then
    echo "Datenbank ist online."
    echo "Nächster Schritt..."
else
    echo "Datenbank ist offline"
    exit 1
fi
echo Test

{...}あるいは、一部のシェルではsubshel​​lの代わりにグループ化を使用できますが、読みやすくする(...)ために私が提供した少し長いバージョンを使用する方が良いと思います。

答え2

あなたの問題は、クローズグループにコマンドがあり、exitクローズ( ... )グループのすべてのコマンドを実行することです。サブシェルこのコマンドグループ用に特別に作成されました。したがって、あなたのexitステートメントは、スクリプトを実行するデフォルトのシェルではなくサブシェルにのみ適用されます。

この場合、「1行」アプローチではなくコマンドを明示的にテストすることをお勧めします。

#!/bin/bash

if Br3trans -u / -c -f dbstate
then
   echo "Datenbank ist online"
   echo "Nächster Schritt ..."
else
   echo "Datenbank ist offline"
   exit 1
fi
echo "Test"

必要に応じて1行で書くことができます。

if Br3trans -u / -c -f dbstate; then echo "Datenbank ist online"; echo "Nächster Schritt"; else echo "Datenbank ist offline"; exit 1; fi
echo "Test"

関連情報