导语
shell程序入门的最后一部分,这一篇介绍命令的拓展,here文档,调试命令和实现shell界面交互的dialog
命令的执行
编写脚本时,有时候需要在脚本中获取其他命令的结果作为变量值或输出值,通常可以可用$(command)来实现,也可以用` `来实现,一个示例程序和结果如下
echo the current directory is $PWD
echo the current users are $(who)
whoisthere=${who}
echo $whoisthere
echo `who`
算术拓展
当需要处理算数命令时,可以使用expr命令,但是它的运行速度更慢(需要调用新shell),用$(())效率更高,但需要注意的是,$()和$(())不同,前者用于命令的执行和获取输出,后者是算术替换,书上给出的例子和运行结果如下
x=0
while [ "$x" -ne 10 ]; do
echo $x
x=$(($x+1))
#x=$(expr $x + 1)结果一样
done
exit 0
参数拓展
在shell中,可以实现对参数的某个部分进行不停的变化和循环,对参数进行拓展,书上给出的部分参数拓展方法如下
下面是一个例子
echo ${foo:-bar}
foo=111
echo ${foo:-bar}
foo=/usr/bin/aaa.bbb
echo ${foo#*/}
echo ${foo##*/}
bar=/usr/local/etc/local/networks
echo ${bar%local*}
echo ${bar%%local*}
exit 0
here文档
在shell中,向一条命令传递输入还可以用here来实现,它可以使得一条命令在获得数据时就好像在读取一个文件或键盘,但实际上是从脚本程序中拿到的
here文档以<<开始,之后跟着一个特殊字符序列,中间是内容,结尾仍然是这个特殊字符序列,下面给出一个例子
cat <<HERE
hello
this is a test
HERE
这里的HERE并没有在输出中体现,只作为了一个类似大括号的作用,当然HERE也可以替换成别的带有特殊符号的语句
调试脚本程序
shell不像其他高级程序语言有很成熟的IDE,出错的时候stdout上一般会显示哪一行有问题,但并不意味shell不可调试,下面给出书上的调试选项
可以看到,set命令可以用来调试,如set -o 就是启用,而set +x就是禁用
不仅如此,在shell的调试中也可以获得退出码来查看程序的状态
dialog
dialog仅仅在shell程序设计中有用,并且现在的很多Linux系统中并没有按照它,需要手动安装
dialog使得shell程序设计可以图形化并更加交互化,有点类似QT,下面是一个简单的例子
dialog --msgbox "This is a test" 9 18
可以看到这行命令生成了一个对话框,通过按确认可以关闭它,除了简单的消息框之外,还有别的类型的界面以及对应的参数,以下为书上给出的部分类型和参数
下面是一个更复杂的例子
dialog --title "请选择" --checklist "选择数字" 15 23 3 1 "一" "关闭" 2 "二" "打开" 3 "三" "关闭"
可以看到生成了一个复选框,复选框高15字符,宽25字符,每个选项高3字符,之后的中文是默认的选项
每个菜单选项有三个值,编号,文本,状态,对应代码中的1,一,off
下面给出一个能和用户进行交互的例子和显示
dialog --title "Questionaire" --msgbox "This is a test" 9 18
dialog --title "Confirm" --yesno "Continue?" 9 18
if [$? !=0 ]; then
dialog --infobox "ALL right" 5 20
sleep 2
dialog --clear
exit 0
fi
dialog --title "Questionaire" --inputbox "Enter name" 9 30 2>_1.txt
name=$(cat _1.txt)
dialog --menu "$name,choose music" 15 30 4 1 "Classical" 2 "Jazz" 3 "Country" 4 "Other" 2>_1.txt
music=$(cat _1.txt)
if [ "$music" = "1" ];then
dialog --title "play classical" --msgbox "Good choice!" 12 25
else
dialog --title "no matter" --msgbox "pity" 12 25
fi
sleep 2
dialog --clear
exit 0
可以看到这个程序实现了简单的交互,通过交互获得了用户的名字和选择的音乐类型,并做出相对应的回复
总结
本章介绍了命令的使用,更重要的是介绍了dialog的使用,使得shell编程有更强的交互性
参考文献
- 《Linux程序设计(第4版)》