2

最近、Bash スクリプトの 1 つに問題がありました。これは、実行した SSH コマンドの 1 つからの予期しない出力が原因でした (OS バージョンのアップグレードによる)。この出力には (リモート スクリプトからの) 数値ステータス コードのみが含まれていると予想していたため、実際にはこの問題により Bash 構文エラーが発生し、それを算術式で使用しました。

しかし、私が驚いたのは、私の Bash スクリプトが構文エラーを報告した後も実行を続けていたことです。これは、ファイルの先頭近くに次の行があるにもかかわらずです。

# Terminate script if any command fails
set -o errexit

構文エラーは明らかにコマンドの失敗と同じではありませんが、前者はさらに深刻なエラー状態を表しているように私には思えます。

-n パラメータを使用して、実際にコマンドを実行せずに Bash スクリプトの構文をチェックできることは知っていますが、それでもこの問題は検出されませんでした。

エラーが発生するが終了しない例を次に示します。

#!/bin/bash
set -o errexit
x=")"
echo $(( x + 1 ))
echo still running

通常の操作中に算術式の構文エラーが検出された直後に Bash スクリプトを強制的に終了させる方法はありますか?

4

1 に答える 1

1

簡単な答えは、この場合、以下を調べることでトラップできるということです$?

#!/bin/bash
x=")"
echo $(( $x + 1 ))
if [[ $? != 0 ]]; then
    echo >&2 "caught syntax error; aborting"
    exit $?
fi
echo success

ただし、このアプローチは常に機能するとは限りません。

#!/bin/bash
x="-1"
(( x += 1 ))
if [[ $? != 0 ]]; then
    echo >&2 "caught syntax error; aborting"
    exit $?
fi
echo success

結果は次のようになります。

caught syntax error; aborting

bash(1)マニュアルページには次のように書かれています。

The evaluation is performed according to the rules listed below
under ARITHMETIC EVALUATION.  If expression is invalid, bash
prints a message indicating failure and no substitution occurs.

しかし、これは構文エラーに関するBashのかなり独特な振る舞いの詳細を隠します。例えば、

#!/bin/bash
x=")"
if echo $(( $x + 1 )); then
    echo success
else
    echo failure
fi; echo "almost end of script"
echo "end of script"

結果:

./foo.sh: line 3: ) + 1 : syntax error: operand expected (error token is ") + 1 ")
end of script

ちなみに、これにはset -o errexit何の違いもないようです。

于 2013-03-10T22:20:43.243 に答える