Agar aman, saya ingin bash membatalkan eksekusi skrip jika menemui kesalahan sintaksis.
Yang mengejutkan saya, saya tidak bisa mencapai ini. ( set -etidak cukup.) Contoh:
#!/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!'
Hasil (bash-3.2.39 atau 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!
$
Ya, kami tidak dapat memeriksa $?setelah setiap pernyataan untuk mengetahui kesalahan sintaksis.
(Saya mengharapkan perilaku aman dari bahasa pemrograman yang masuk akal ... mungkin ini harus dilaporkan sebagai bug / keinginan untuk mem-bash pengembang)
Eksperimen lebih banyak
if tidak ada bedanya.
Menghapus 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!'
Hasil:
$ ./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!
$
Mungkin, ini terkait dengan latihan 2 dari http://mywiki.wooledge.org/BashFAQ/105 dan ada hubungannya dengan (( )). Tapi saya merasa masih tidak masuk akal untuk terus mengeksekusi kesalahan sintaks.
Tidak, (( ))tidak ada bedanya!
Itu berperilaku buruk bahkan tanpa tes aritmatika! Hanya skrip dasar yang sederhana:
#!/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!'
Hasil:
$ ./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 -etidak berhasil. Tapi pertanyaan saya masih masuk akal. Apakah mungkin untuk membatalkan kesalahan sintaks?
set -etidak cukup karena kesalahan sintaks Anda dalamifpernyataan. Di tempat lain harus batalkan naskah.