最近写了一些简单的 shell 脚本,采用逐行检测的方式调试,效率实在是太低了。在看书和网上查资料的时候,找到了一些比较高效的调试技巧,在此做一个总结。
1. sh
命令参数
script 在执行前最怕的就是出现语法错误,对此我们可以通过 sh
的相关参数进行判断。
$ sh [-nvx] scripts.sh
参数:
-n : 不要执行 script, 仅查询语法问题
-v :在执行前,先将 script 的内容输出到屏幕上
-x : 将使用到的 script 内容显示到屏幕上,非常有用的参数!
sh -x
的方式可以将命令执行过程也显示出来,如此我们可以判断脚本代码执行到哪一段时会出现相关的信息!通过显示完整的命令串,就能够根据输出的错误信息来修改我们的脚本了。
2. 显示脚本的使用说明
在我们开始写Shell脚本的初期,常会使用 echo 命令显示脚本的使用说明。 但当说明的文字较多时,echo 语句就会变得一团糟。随后我发现,可以使用 cat命令来显示使用说明。
cat << EOF
Usage: myscript <command> <arguments>
VERSION: 1.0
Available Commands
install - Install package
uninstall - Uninstall package
update - Update package
list - List packages
EOF
这里的 << 称为 here document,它可以将字符串放置在两个 EOF 之间。
3. 检查字符串活数组的长度
我曾经在面试一家游戏公司中被总监问到这个问题,,,
if [ ${#authy_api_key} != 32 ]; then
red "you have entered a wrong API key"
return $FAIL
fi
${#VARIABLE_NAME}
可以给出字符串的长度
length=${#array_name[@]}
或者 length=${#array_name[*]}
则可以获得数组的长度
更多内容参考 http://c.biancheng.net/cpp/view/7002.html
4. 设置 debug 信息
仅当设置DEBUG标志时才打印调试信息
function debug() { ((DEBUG)) && echo ">>> $*"; }
function debug() { [ "$DEBUG" ] && echo ">>> $*"; }
5. 让你的echo丰富多彩
很多时候,你会想让echo能以多种颜色区分不同输出。比如,绿色表示成功,红色告知失败,黄色提示警告。
NORMAL=$(tput sgr0)
GREEN=$(tput setaf 2; tput bold)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)
function red() {
echo -e "$RED$*$NORMAL"
}
function green() {
echo -e "$GREEN$*$NORMAL"
}
function yellow() {
echo -e "$YELLOW$*$NORMAL"
}
# To print success
green "Task has been completed"
# To print error
red "The configuration file does not exist"
# To print warning
yellow "You have to use higher version."
这里使用 tput 来配置输出颜色,输出文本,最后再恢复默认输出颜色。如果想对 tpu 了解更多,参看 prompt-color-using-tput