shell程序设计入门(四)

导语

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编程有更强的交互性

参考文献

  1. 《Linux程序设计(第4版)》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值