了解Shell脚步内部的执行顺序,对于学习、阅读Shell脚步是非常有帮助的。Shell脚步不是复杂的程序,它是按行解释的,即从.sh脚步文件开头一直执行到文件末尾。值得注意的是,函数只有在显示调用的时候,才会去执行函数的内部,如果该函数不被调用,那么按照从上到下执行院长,遇到函数定义会直接跳过。
比如对于下面的这段Shell脚步文件:
#!/bin/sh
echo "START ......"
var_1="hello world"
var_2=
test() {
echo "test function"
var_2="lxg"
}
echo ${var_2}
test
echo "END ......"
其内部的执行流程如下图所示:

执行结果是:

上面的脚步文件中,echo ${var_2}的结果为空,虽然该变量在函数test中被重新初始化为"lxg",但是test函数的调用是在echo ${var_2}的下一步调用,所示此时的变量var_2的值还是为空。在调用test函数前,test函数定义直接被跳过,只有在显示调用该函数时候才回去执行该函数的内部(从C/C++语言的角度将,就是函数体)。
Shell脚本不需要编译,也没有类似于gdb这样的调试工具,所以一些基础语法需要在执行时候才知道有没有错误。而无法像C/C++语言那样在编译阶段就可以知晓语法错误。因此这也给Shell开发、调试带来了一点的挑战性。
我看到很多开发同事在调试Shell脚本时候,根据报错信息提示,一行行地去.sh文件中添加打印日志,其实这种效率是很低下的,无非于在C/C++代码中添加printf()打印。其实在Shell脚本中也有一种类似于gdb效果的调试方法,它可以显示地打印你当前脚本的执行位置和正误情况,是你一目了然地知道当前脚本出错的具体位置。 那就是在sh命令执行添加参数“-x”。这么有用的命令居然在多本讲述Shell的书籍上都未曾提到过。
这里仍然以上面的那个demo为例,来演示一遍如果调试.sh脚本文件。

如果哪里有语法错误,终端便会进行打印,再结合代码,十分清晰。