Shell脚本启动和停止功能中意外的代码执行顺序

时间:2018-09-20 19:05:01

标签: 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'

请注意,它首先打印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脚本进行了错误分析?

1 个答案:

答案 0 :(得分:2)

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

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