脚本程序的调试通常都很容易,但并没有特定的辅助工具。当出现错误时,shell一般都会打印出包含错误的行的行号。如果这个错误并不是非常明显,我们可以添加一些额外的echo语句来显示变量的内容。
因为脚本程序是解释执行的,所以在脚本程序的修改和重试过程中没有编译方面的额外开支。
命令行选项 set选项 说明
sh -n <script> set -o noexec set -n 只检查语法错误,不执行命令
sh -v <script> set -o verbose set -v 在执行命令之前回显它们
sh -x <script> set -o xtrace set -x 在处理完命令行之后回显它们
set -o nounset set -u 如果使用了未定义的变量,就给出出错消息
2.here文档
在shell脚本程序中向一条命令传递输入的一种特殊方法是使用here文档。它允许一条命令在执行时就好像在读取一个文件或键盘一样,而实际上是从脚本程序中得到输入数据。
实验:使用here文档
最简单的例子就是给cat命令提供输入数据,如下所示:
#!/bin/sh
cat << !FUNKY!
hello
this is a here
document
!FUNKY!
它的输出如下所示:
hello
this is a here
docum
ent
here文档看起来是相当奇怪的功能,但在实际工作中它的作用是很大的,因为它允许我们调用交互式的程序,比如一个编译器,并向它提供一些实现定义好的输入。
here文档另一个用法。
我们从名为a_text_file的文件开始,它的内容如下所示:
That is line 1
That is line 2
That is line 3
That is line 4
我们可以通过结合使用here文档和ed编辑器来编辑这个文件,
#!/bin/sh
ed a_text_file << !FunkyStuff!
3
d
. , \$s/is/was
w
q
!FunkyStuff!
exit 0
这个脚本程序简单地调用ed编辑器并向它传递命令,先让它移动到第三行,然后删除改行,再把当前行中的is替换为was。完成这些操作的ed命令来自脚本程序中的here文档。
迈向图形化:dialog工具
这并不是shell的一部分,但通常下它仅仅在shell程序设计中有用。
dialog工具的整体思想非常简单:一个带有各种各样参数和选型的单个程序,它允许你显示不同类型的图形框,范围涵盖从最简单的Yes/No框到输入框,甚至菜单选型。
类型 用于创建类型的选项 含义
复选框 --checklist 允许你显示一个选项列表,每个选项都可以被单独的选择。
信息框 --infobox 在显示消息后,对话框将立刻返回,但并不清除屏幕。
输入框 --inputbox 允许用户输入文本
菜单框 --menu 允许用户选择列表中的一项
消息框 --msgbox 向用户显示一条消息,同时显示一个OK按钮,用户可以通过选择该按钮继续操作
单选框 --radiolist 允许用户选择列表中的一个选项
文本框 --textbox 允许在带有滚动条的文本框中显示文件的内容
是/否框 --yesno 允许你提问,用户可以选择yes或no
对话框类型 参数
--checklist text height width list-height [tag text status] ...
--infobox text height width
--inputbox text height width [initial string]
--menu text height width menu-height [tag item] ...
--msgbox text height width
--radiolist text height width list-height [tag text status] .....
--textbox filename height width
--yesno text height width
dialog --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" 3 "three" "off"
我们用参数--checklist来创建一个复选框,选项--title将标题设置为Check me,下一个参数是提示信息Pick Numbers.
接下来设置对话框的大小,它高15行,宽25个字符,同时有3行被用做菜单。
选项的设置看上去需要有一些技巧,但是必须知道的是每个菜单选项有三个值:
编号
文本
状态
因此第一项的编号是1,显示的文本是“one”并且状态设置为“off”,然后设置下一个菜单项,它的值分别是2,“two”和选中,