《Linux命令行与shell脚本编程大全》第二十六章 一些有意思的脚本
26.1 发送消息
26.1.1 功能分析
1.确定系统中都有谁
$who
给出的信息包括用户名 用户所在终端 用户登入系统的时间
2.启用消息功能
用户可以禁止别人给我发消息,所以需要先检查一下是否允许发送消息。
$mesg
结果是is n说明消息发送被关闭了。 is y 表示允许发送消息
还可以查看别人的消息状态,
$who –T
用户名后面的-表示用户的消息功能已经关闭。+表示已经启用
要接受消息可以使用mesg 的y选项,这样消息功能就启用了。
$mesg y
3.向其他用户发送消息
消息功能启用以后,就可以使用write命令通过用户名和当前终端向其发消息
用who查看:给xiaochongyong pts/19发送消息
$write xiaochongyong pts/19 #这样就是发送消息
我开了两个终端,一个是pts/17 一个是19。下面是19接收到的
注意:接收方接到消息后经常需要按回车来重新获得命令行提示符
26.1.2 创建脚本
有几个步骤
1)先检查用户是否登录
2)检查用户是否能接收消息
3)检查是否包含要发送的消息
4)发送消息
代码如下:
xcy@xcy-virtual-machine:~/shell/26zhang$ cat mu.sh
#!/bin/bash
muser=$1
logged_on=$(who | grep -i -m 1 $muser | gawk '{print $1}')
#1) determine if user is logged
if [ -z $logged_on ]
then
echo "$muser is not logged on"
echo "Exiting script......"
exit
fi
#2) determine if user allows messages
allowed=$(who -T | grep -i -m 1 $muser | gawk '{print $2}')
if [ $allowed != "+" ]
then
echo "$muser does not allowing messageing."
echo "Exiting script......"
exit
fi
# 3) check message
if [ -z $2 ]
then
echo "No message parameter included"
echo "Exiting script......"
exit
fi
shift
while [ -n "$1" ]
do
whole_message=$whole_message' '$1
shift
done
# 4) Send message to user
uterminal=$(who | grep -i -m 1 $muser | gawk '{print $2}')
echo $whole_message | write $logged_on $uterminal
exit
运行结果:
可以看到右下角的提醒:
26.2 获取格言
26.2.1 功能分析
在指定的网址上提取一行格言,励志的话。
1.学习wget
wget能够将web页面下载到本地linux系统中。
功能十分丰富,这里只介绍一点点。
如何使用,使用wget命令和网站地址就行了
$wget www.baidu.com
会将网站的信息存储在与web页面同名的文件中。这里是保存在了index.html
还可以通过-o选项指定将会话输出保存在日志文件中
$wget –o baidu.log www.baidu.com
还可以用-O,控制web页面信息保存的位置。可以自己指定文件名,
$wget –o baidu.log –O baidu.html www.baidu.com
2.测试web地址
有写wed地址会变化。所以需要测试地址的有效性。
使用 –spider选项
$wget –spider www.baidu.com
还可以加上-nv选项,精简输出信息
$wget –spider –nv www.baidu.com
这里可以测试一个无效的地址
$wget –spider –nv www.xiaochongyong.com
26.2.2 创建脚本
xcy@xcy-virtual-machine:~/shell/26zhang$ cat quota.sh
#!/bin/bash
quote_url=www.quotationspage.com/qotd.html
#quote_url=www.baidu.com
check_url=$(wget -nv --spider $quote_url 2>&1)
if [[ $check_url == *error404* ]]
then
echo "Bad web address"
echo "$quote_url invalid"
echo "Exiting script ..."
exit
fi
#wget -o /tmp/quote.log -O /tmp/quote.html $quote_url
wget -o quote.log -O quote.html $quote_url
sed 's/<[^>]*//g' quote.html | #去除<>
#grep "$(date +%B' '%-d,' '%Y)" -A2 | #匹配格言中当前日期的右边。-A2选项提取出另外 两行文本
grep "28, $(date +%Y)" -A2 | # xcy add
sed 's/>//g' | # 删除>
sed '/ /{n ; d}' |
gawk 'BEGIN{FS=" "} {print $1}' |
tee daily_quote.txt > /dev/null #保存文件
exit
xcy@xcy-virtual-machine:~/shell/26zhang$ ./quota.sh
xcy@xcy-virtual-machine:~/shell/26zhang$ cat daily_quote.txt
Selected from Michael Moncur's Collection of Quotations - November 28, 2017
Perpetual devotion to what a man calls his business, is only to be sustained by perpetual neglect of many other things. Robert Louis Stevenson (1850 - 1894)
xcy@xcy-virtual-machine:~/shell/26zhang$
注意这个:#grep "$(date +%B' '%-d,' '%Y)" -A2 |
由于我的乌班图是中文的,一直都搜不到November。我就把它换成了这个,只匹配28, 2017
grep "28, $(date +%Y)" -A2 | # xcy add
本来想这样的grep "$(date +%-d,’ ’%Y)" -A2 | # xcy add,不知道为啥我的日期是29。而网站上的是28.可能跟是美国的网站有关系。
26.3 编造借口
curl工具允许你从特定的Web服务器中接收数据。还可以用它发送数据。
这里测试需要美国的SMS卡,就不研究了。