我有以下脚本
#!/bin/bash
#test1.sh
echo "test ... "
for i in 1 2 3 4 5
do
#echo "Welcome $i times"
done
exit 0
,输出为
test ...
./test11.sh: line 7: syntax error near unexpected token `done'
./test11.sh: line 7: `done'
请注意,它首先打印test...
,然后抱怨语法错误。
但是在以下脚本中
#test2.sh
#!/bin/bash
case "$1" in
'start')
echo "in start 1"
echo "in start 2"
echo "in start 3"
echo "test ... "
for i in 1 2 3 4 5
do
#echo "Welcome $i times"
done
;;
'stop')
echo "in stop"
;;
'restart')
stop ; echo "Sleeping..."; sleep 1 ;
echo "in restart"
;;
'status')
echo "in status"
;;
*)
echo
echo "Usage: $0 { start | stop | restart | status }"
echo
exit 1
;;
esac
exit 0
输出为
./test10.sh: line 18: syntax error near unexpected token `done'
./test10.sh: line 18: ` done'
脚本在line:18
上抱怨语法错误。由于它是一种脚本语言,因此应该逐行执行。在上面的代码中,应首先执行start
,然后继续逐行执行。因此,我希望输出消息应该首先打印[echo "in start 1" etc
],然后打印语法错误。
为什么以上两个shell脚本的行为不同?在开始执行之前,是否先对Shell脚本进行了错误分析?
答案 0 :(得分:2)
第二个示例中的for
循环嵌入在case
语句中,而不是顶级语句。需要解析整个case
语句才能执行它,这意味着即使for
(在展开时)不执行,也要解析start
子句中的$1
循环。不会导致选择start
。
根据定义,语法错误是无法解析的结果,而不是无法评估的结果。