Linux shell脚本启动和停止函数中出现意外的代码执行顺序

Linux shell脚本启动和停止函数中出现意外的代码执行顺序,linux,bash,shell,Linux,Bash,Shell,我有下面的脚本 #!/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' ./test10.sh: line 18: syntax err

我有下面的脚本

#!/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'
./test10.sh: line 18: syntax error near unexpected token `done'
./test10.sh: line 18: `            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
输出是

test ... 
./test11.sh: line 7: syntax error near unexpected token `done'
./test11.sh: line 7: `done'
./test10.sh: line 18: syntax error near unexpected token `done'
./test10.sh: line 18: `            done'
脚本在
第18行抱怨语法错误。因为它是一种脚本语言,所以应该逐行执行。在上面的代码中,执行应该首先转到
开始
,然后继续逐行执行。因此,我希望输出消息应该首先打印[
echo“in start 1”etc
],然后是语法错误


为什么上面两个shell脚本的行为不同?是否在开始执行之前首先分析shell脚本的错误

第二个示例中的
for
循环嵌入在
case
语句中,而不是作为顶级语句。整个
case
语句需要解析才能执行,这意味着解析
start
子句中的
for
循环,即使
$1
(展开时)不会导致选择
start


根据定义,语法错误是无法解析的结果,而不是无法计算的结果。

第二个示例中的
for
循环嵌入在
case
语句中,而不是作为顶级语句。整个
case
语句需要解析才能执行,这意味着解析
start
子句中的
for
循环,即使
$1
(展开时)不会导致选择
start

根据定义,语法错误是无法解析的结果,而不是无法计算的结果