高级Bash脚本编程指南.

bash笔记-06-交互式脚本

前面曾经提到,在Linux中使用的bash(不管是图形模式里的terminal还是文本模式里的console)是交互式的.用户在bash提示符后输入一个命令, bash执行后将信息反馈给用户.

所谓的非交互式bash一般是针对脚本而言的, 我们可以把脚本写成非交互式的: 不需要读取用户的输入, 也不用向用户反馈某些信息. 非交互式有两个特点: (1)每次执行都是可预见的, 因为它不读取用户输入, 参数是固定的. (2) 可以在后台执行.

与非交互式脚本对应的是交互式脚本: 它可以读取用户的输入, 实时向用户反馈信息. 这样的脚本更灵活, 每次执行时的参数可由用户动态设定. 用户界面也更友好.

实际上, “交互”的含义就是脚本能向用户输出某些信息或读取用户的输入.

草稿:这是一篇未完成的文章,仅供参考!

1, 输出信息


一般使用echo, printf这样的bash内嵌命令来输出信息.

echo
echo向stdout输出表达式或变量. 默认地, echo会在输出后换行. 可以有两种方式关闭echo的换行:

$ echo -n “hello, world”
$ echo -e “hello, world\c”

-n去掉echo末尾的换行符, -e打印出转义字符. 在linux/bash系统中, 推荐使用-n.

printf
如果想生成格式化输出, 建议使用printf而非echo. 老版本的bash不支持printf, 但教新的都支持.
printf和c中的printf函数很像:
printf “format string” parameter1 parameter2 …

但bash中的printf不能输出浮点数(bash中的算术运算都是针对整数执行的).

$ printf “%s %d\t %s\n” “hi there” 15 “people”
hi there 15      people

2, 读取用户输入


与echo或printf相对, bash使用echo来读取用户输入, read的格式如下:
read [options] NAME1 NAME2 ... NAMEN

注意: 用户输入值由IFS分隔, 它们被以此赋给NAME1, NAME2…NAMEN. 如果用户的输入少于n个, 那么多余的NAMEM~NAMEN的值为空. 如果未指定NAME1~NAMEN, 那么用户输入被赋给REPLY变量. read还可以使用-u选项来读取文件描述符.
若read读取成功, 那么返回值为0. read出错的情况可能有: 读取EOF文件结束符, 指定的文件描述符无效.

e.g.
$ echo “input your name”
$ read NAME or   $ read
$ echo $NAME or    $ echo $REPLY

read的选项列于下表:

Option Meaning
-a ANAME The words are assigned to sequential indexes of the array variable ANAME, starting at 0. All elements are removed from ANAME before the assignment. Other NAME arguments are ignored.
-d DELIM The first character of DELIM is used to terminate the input line, rather than newline.
-e readline is used to obtain the line.
-n NCHARS read returns after reading NCHARS characters rather than waiting for a complete line of input.
-p PROMPT Display PROMPT, without a trailing newline, before attempting to read any input. The prompt is displayed only if input is coming from a terminal.
-r If this option is given, backslash does not act as an escape character. The backslash is considered to be part of the line. In particular, a backslash-newline pair may not be used as a line continuation.
-s Silent mode. If input is coming from a terminal, characters are not echoed.
-t TIMEOUT Cause read to time out and return failure if a complete line of input is not read within TIMEOUT seconds. This option has no effect if read is not reading input from the terminal or from a pipe.
-u FD Read input from file descriptor FD.

3, 读入及输出文件


使用图形前端显示交互式脚本的运行


可以使用dialog或Xdialog来构建脚本的前端界面. dialog是基于控制台的, 我们熟悉的Linux的menuconfig界面就是使用的dialog. Xdialog是基于x11的, 显示更加友好.

Ubuntu/Debian上默认是没有安装dialog和Xdialog的, 下面的命令安装它们:
$ sudo apt-get install dialog xdialog

OK, 下面看看dialog和Xdialog的用法.
(一) 一个简单的示例.

#!/bin/bash
DIALOG=${DIALOG=dialog}

$DIALOG --title " My first dialog" --clear \
        --yesno "Hello , this is my first dialog program" 10 30

运行它, 得到下面的图形:

将DIALOG=${DIALOG=dialog}改为DIALOG=${DIALOG=Xdialog}, 再次执行上述的脚本

下面解释一下上述的脚本:
#!/bin/bash就不用多说了, 所有的bash脚本起始行都是它.
DIALOG=${DIALOG=dialog} 设置DIALOG变量, 你可以将它设置为dialog或Xdialog(注意X为大写!)

重点是dialog的选项, 选项以"--"为前缀, 后面跟着可选的参数.
--title : 窗口的名称.
--clear : 在显示窗口之前清屏.
--yesno : 指定窗口的模板. dialog支持多种窗口, 见下表:
选 项 窗口类型
–yesnobox 含有”yes”和”no”按钮
–menu 构建菜单
–inputbox 读取用户输入
–msgbox 只含有”ok”按钮
–textbox 在dialog中显示文本文文件的内容
–infobox 与–msgbox相似
–checklist 与–menu相似, 但可显示那些条目被选择了.
–radiolist 与–menu相似, 但可显示那些条目被选择了.

关于dialog, Xdialog的更多信息
http://linuxgazette.net/101/sunil.html

http://www2.linuxjournal.com/article/2807

Dialog脚本示例: http://www.fifi.org/doc/dialog/examples/.

(56)

分类: 应用

发表评论

电子邮件地址不会被公开。