调试方法
静态检查语法错误
- 读一遍脚本中的命令但不执行,用来检查脚本中的语法错误
sh -n script.sh
* 自己测试即使脚本语法有错,也没打印任何信息
动态运行逻辑错误
- 运行一条命令
sh -c "echo 'hello'"
- 运行一条命令,没什么作用。
- 运行脚本,输出运行结果和原始代码;
sh -v script.sh
- 一边执行脚本,一边将执行过的脚本命令打印到标准输出端。
- 运行脚本,输出运行结果和替换变量后的代码。
sh -x script.sh
- 提供跟踪执行信息,将执行的每一条命令(替换变量成内存数据)和结果一次打印出来
使用工具调试
ShellCheck
- 是一个Shell脚本分析工具,可以为bash/sh shell脚本提出警告和建议。官网:http://www.shellcheck.net/ GitHub:https://github.com/koalaman/shellcheck
ExplainShell
- write down a command-line to see the help text that matches each argument, 官网:https://www.explainshell.com/
BASH Debugger
- 主页:http://bashdb.sourceforge.net/
- 下载地址:https://sourceforge.net/projects/bashdb/files/
- 使用手册:http://bashdb.sourceforge.net/bashdb-man.html
- 借助第三方工具bashd可以更加精细地调试Shell脚本。具有断点、单步执行、观察变量等功能。
下载时需根据所使用的bash版本选择相应的bashdb,否则会提示因为版本不符合而无法安装。
使用这些选项有三种方法
- 在命令行提供参数:$sh -x script.sh
- 脚本开头提供参数:#!/bin/sh -x
- 在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用
另:在写脚本的时候,需特别注意添加空格或换行或分号
eg text命令: $[ 5 -lt 10 ]左方括号后须有空格,右方括号前也须有空格
shell脚本中函数定义: foo() {后须有空格或换行
shell脚本中,若同一行内写有两条命令须加分号
与C语言不同的是,shell脚本中,返回值0表真,1表假。
调试时打印代码行号和函数名
- bash 下可以设置环境变量 $PS4 实现。
* 为sh -x追加行号显示:
export PS4='+{$LINENO:${FUNCNAME[0]}} '
* $LINENO,代表shell脚本的当前行号
* $FUNCNAME,函数的名字,包含了整个调用链上所有的函数的名字,[0]当前函数,[1]上个调用函数...