开启shell环境
Mac系统下,自带的终端就是一个标准的shell环境,笔者这里没有使用自带的终端,而是自己安装了iTerm2,这也是一个标准的shell环境。
创建shell脚本的路径
mkdir -p shell/script
创建shell脚本
1)shell脚本的格式是.sh的文件,使用vim编辑器创建脚本。
vim first_shell.sh
2)编辑shell脚本内容
#!/bin/bash
#This is a shell script
echo "hello world!"
脚本中的第一行#!/bin/bash
的作用是提示这一文件是shell脚本文件;
第二行是注释行,shell脚本中用#来进行注释;
接下来就是shell命令行,这是shell脚本中真正执行的语句;
脚本编辑完成后,保存退出。
shell脚本的执行
执行shell脚本有以下两种方法:
1)直接使用命令/bin/bash
或bash
切换到shell执行环境,然后执行.sh文件
/bin/bash first_shell.sh
2)给.sh文件添加执行权限
首先使用ls -l
查看文件权限
可以看到当前文件是没有执行权限,使用命令chmod
来修改文件的权限,这里修改为当前用户有执行权限
chmod u+x first_shell.sh
然后,使用以下命令执行
./first_shell.sh
shell脚本的调试
- bash -n first_shell.sh
-n选项可用于测试shell脚本是否存在语法错误,不会实际执行命令。养成完成shell脚本后使用-n选项来测试脚本是否存在语法错误是一个很好的工作习惯。 - bash -c “string”
-c选项可以使shell解释器从一个字符串而不是文件中读取并执行shell命令。该选项对于需要临时测试一小段脚本的执行结果时很有用,示例如下:
- bash -x first_shell.sh
-x选项用来跟踪脚本的执行,是调试shell脚本的工具,-x选项是shell在执行脚本的过程中,显示实际的每一行信息,且在行首显示一个’+‘号,’+'号后面显示的是经过变量替换之后的命令行的内容,有助于分析命令的执行过程,示例如下:
shell脚本内容:
#!/bin/bash
#define funciton
function add ()
{
if (( $# < 2 ));then
echo "please input two numbers!"
exit
fi
return $(($1 + $2))
}
add $1 $2
echo "Sum is $? "
调试过程:
1)未输入参数的情况
2)正确输入参数的情况
对“-x”选项的增强
观察上面使用-x选项来对shell脚本调试的输出结果,调试的输出信息是进行变量替换之后的命令行内容以及在行首的’+'号提示符,对于行数比较多的复杂脚本来说,还是很难在shell脚本中定位到具体的有问题的行,可以使用shell的内置环境变量来增强“-x”选项的输出信息,比如行号、函数名等。
内置环境变量$LINENO可以表示shell脚本的当前行号;
内置环境变量$FUNCNAME表示函数的名字,这个变量是一个数组变量,包含了整个调用链上所有的函数名,${FUNCNAME[0]}表示当前正在执行的函数的名称,${FUNCNAME[1]}表示调用函数${FUNCNAME[0]}的函数名称,以此类推。。
在shell PS变量中也介绍过,PS4变量是跟踪执行输出的前缀,默认为‘+’,而bash -x 调试信息中的“+”号正是$PS4的值,因此可以通过重定义PS4的值来增强-x选项的输出。
可以在执行调试命令前,先执行export PS4=’+{
L
I
N
E
N
O
:
LINENO:
LINENO:{FUNCNAME[0]}}’,临时将PS4变量设置成+{行号}:{当前函数名称}的形式,也可以将PS4的设置信息写入.bash_profile文件中,运行source .bash_profile让其生效,使PS4的设置永久生效,新的调试信息如下:
输入参数的情况:
当然,也可以使用其他的内置环境变量来重定义PS4变量,目的是提高调试信息的可读性。