เพื่อความปลอดภัยฉันต้องการทุบตียกเลิกการทำงานของสคริปต์หากพบข้อผิดพลาดทางไวยากรณ์
ฉันประหลาดใจมากฉันไม่สามารถทำสิ่งนี้ได้ ( 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!
$
เราไม่สามารถตรวจสอบ$?
หลังจากทุกคำสั่งเพื่อตรวจจับข้อผิดพลาดทางไวยากรณ์
(ฉันคาดหวังพฤติกรรมที่ปลอดภัยเช่นนี้จากภาษาการเขียนโปรแกรมที่สมเหตุสมผล ... บางทีนี่อาจต้องรายงานเป็นข้อผิดพลาด / ต้องการทุบตีผู้พัฒนา)
ทดลองเพิ่มเติม
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!
$
บางทีก็เกี่ยวข้องกับการออกกำลังกาย 2 จากhttp://mywiki.wooledge.org/BashFAQ/105(( ))
และมีสิ่งที่จะทำอย่างไรกับ แต่ฉันคิดว่ามันยังไม่มีเหตุผลที่จะดำเนินการต่อหลังจากข้อผิดพลาดทางไวยากรณ์
ไม่(( ))
สร้างความแตกต่าง!
มันทำงานไม่ดีแม้จะไม่มีการทดสอบทางคณิตศาสตร์! เพียงสคริปต์พื้นฐานที่เรียบง่าย:
#!/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
คำสั่ง ทุกที่อื่นควรยกเลิกสคริปต์