安全のために、構文エラーが発生した場合、bashはスクリプトの実行を中止します。
驚いたことに、私はこれを達成できません。(set -e
十分ではありません。)例:
#!/bin/bash
# Do exit on any error:
set -e
readonly a=(1 2)
# A syntax error is here:
if (( "${a[#]}" == 2 )); then
echo ok
else
echo not ok
fi
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
結果(bash-3.2.39またはbash-3.2.51):
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 10: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
まあ、$?
すべてのステートメントの後にチェックして構文エラーをキャッチすることはできません。
(賢明なプログラミング言語からこのような安全な動作を期待していました...おそらくこれはバグ/要望としてbash開発者に報告されなければなりません)
より多くの実験
if
違いはありません。
削除if
:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
(( "${a[#]}" == 2 ))
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
結果:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
おそらく、それはhttp://mywiki.wooledge.org/BashFAQ/105の演習2に関連しており、に関係しています(( ))
。しかし、構文エラーが発生した後も実行を続けるのはまだ理にかなっていないと思います。
いいえ、(( ))
違いはありません!
算術テストがなくても動作が悪い!単純で基本的なスクリプト:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
echo "${a[#]}"
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
結果:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
set -e
なかったのかの説明になります。しかし、私の質問はまだ理にかなっています。構文エラーで中止することは可能ですか?
set -e
構文エラーがif
ステートメントにあるため、十分ではありません。他の場所ではスクリプトを中止する必要があります。