0

わかりました、私は bash スクリプト [高度なもの] に慣れていないので、少し助けが必要です。これを正確に表現する方法さえ知らないので、私が何をしているのか、それについて何を知る必要があるのか​​を説明します。私のスクリプトでは、./configure を実行します。configure でエラーが発生したかどうかをキャッチし、それに応じて bash スクリプト内で対応できるようにする必要があります。

コードは次のとおりです。

function dobuild {
echo -e "\e[1;35;40mExecuting Bootstrap and Configure\e[0m"
cd /devel/xbmc
if [ $Debug = "1" ];
then
#either outputs to screen or nulls output
./bootstrap >/dev/null
/usr/bin/auto-apt run ./configure --prefix=/usr --enable-gl --enable-vdpau --enable-crystalhd --enable-rtmp --enable-libbluray  >/dev/null
else
./bootstrap
/usr/bin/auto-apt run ./configure --prefix=/usr --enable-gl --enable-vdpau --enable-crystalhd --enable-rtmp --enable-libbluray
fi
}

configure がエラー 1 または 2 を返したとします。それをトラップして対処するにはどうすればよいですか?

ティア

4

3 に答える 3

2

すべてのシェル コマンドの実行後、その戻り値である 0 ~ 255 の数値がシェル変数で使用可能になります?。この変数の値は、前に$演算子を付けることで取得できます。

?すべてのコマンド、さらにはテストによってリセットされるため、少し注意する必要があります。例えば:

some_command
if (( $? != 0 ))
then
   echo "Error detected! $?" >&2
fi

与える:テスト条件によってリセットされたためError detected! 0。後で使用する場合は、?おそらく別の変数に格納することをお勧めします。これには、複数のテストを行うことが含まれます?

bash で数値テストを行うには、(( ... ))数値テスト構成を使用します。

some_command
result=$?
if (( $result == 0 ))
then
   echo "it worked!"
elif (( $result == 1 ))
then
    echo "Error 1 detected!" >&2
elif (( $result == 2 ))
then
    echo "Error 2 detected!" >&2
else
    echo "Some other error was detected: $result" >&2
fi

caseまたはステートメントを使用します。

于 2013-03-13T08:58:51.147 に答える
1

コマンドの実行後、戻り値はシェル変数 $? に格納されます。したがって、それを成功と失敗の戻り値と一致させる必要があります

if [ $? == 1 ]
then
    #do something
else
    #do something else
fi
于 2013-03-13T06:57:43.037 に答える
0

$? に関する他の回答は? (ただし、0 以外の値と 0 以外の値を想定することに注意してください。コマンドが異なると、同じコマンドの異なるバージョンが異なる値で失敗する可能性があります)。もの:

if command ; then
    # success code here
else
    # failure code here
fi

または、失敗した場合にのみ行動したい場合は、古いシェルのハックを次に示します (コロンは null コマンドですが、then 句を満たします)。

if command ; then : 
else
    # failure code here
fi

しかし、bash のような最新のシェルでは、これの方が優れています。

if ! command ; then   # use the ! (not) operator 
    # failure code here
fi

また、単純なことだけを行う必要がある場合は、「短絡」演算子を使用できます。

   command1 && command2_if_command1_succeeds
   command1 || command2_if_command1_fails

これらは単一のコマンドでのみ機能し、さらに && と || を文字列化します。ほとんどの場合、あなたが考えるかもしれないことをしないので、ほとんどの人はそれを避けます。ただし、それらをグループ化すると、複数のコマンドを実行できます。

   command1 && { command2; command3; command4; }

読みにくくなる可能性があるため、すべてを使用する場合はシンプルにすることをお勧めします。

   command1 || { echo "Error, command1 failed!" >&2; exit 1; }
于 2013-03-13T14:51:42.947 に答える