Linux Shell 脚本学习第一天: 使用grep 命令,lsusb, ps -ef, 实现树莓派(Debian OS)时检测到依赖的USB设备启动后,启动终端自动执行shell脚本
1.应用背景:
无人监测的设备,常需要设置应用程序开机启动,程序启动前需要保证调用的设备先启动,运行环境先启动。
2.test.sh部分源码
#!/bin/sh #查看桌面是否启动 while true; do count=$(ps -ef |grep lxpanel |grep -v "grep" |wc -l) if [ $count -gt 0 ]; then break fi done #查看nginx是否启动 while true; do count=$(ps -ef |grep nginx |grep -v "grep" |wc -l) if [ $count -gt 0 ]; then break fi done while true ; do if [ -b /dev/sda1 ]; then break fi done #检查串口设备是否启动 while true; do if [ -c /dev/ttyusb0 ]; then break fi done while true; do if [ -c /dev/ttyusb1 ]; then break fi done #等待设备号为1e10:4000的usb设备启动 while true; do count=$(lsusb |grep "1e10:4000" |grep -v "grep" |wc -l) if [ $count -eq 1 ];then break fi done # #具体代码 # wait #执行脚本后要保持终端不消失 exec bash eval "$bash_post_rc"
2.1 grep 指令: 用于匹配文本字符
用法1:grep 字符串 文件路径; 用于匹配查找文件中的相同字符串。
用法2:grep -v 字符串;翻转查找,即输出和 grep 字符串 不匹配的项。
用法3:grep -e 字符串,grep -e 字符串, 文件;在文本中查找多个字符串,实现and的效果。
待续...
参考1:
参考2:
2.2 ps -ef | grep 进程名 | grep -v "grep" | wc -1
第一步:ps -ef 列出所有进程及其详细信息,输出为一个超长的文本,可以在脚本中,用echo指令打印内容查看。
第二步: | grep 进程名称字符串;作用:在ps -ef 指令执行输出的文本中,找出进程名称字符串。
| grep -v "grep" 这句的意义在于,将第二步所得结果中,去除含有grep字段的项,因执行grep指令,本身会在进程中引入进程名称字段,可终端敲指令后,执行ps -a 或者ps -ef 验证。
|wc -1 计算总共得到多少条查询结果。
2.3 lsusb
-v 显示所有usb设备的信息,涵盖设备描述符,速度,电流大小,总线号,设备id,速度,厂商信息等等。
-d [厂商id]:[设备id] 匹配指定厂商id和设备id的信息。
...
lsusb |grep "1e10:4000" |grep -v "grep" |wc -l 解释:lsusb执行后,输出所有usb设备描述文本,grep在文本中寻找厂商id和设备id为“1e10:4000”的设备。
参考: man lsuab
3 设置树莓派开机进入桌面时调用tesh.sh shell脚本
第一步: sudo nano /etc/xdg/lxsession/lxde-pi/autostart
第二步:文本最后一行增加:lxterminal -e bash -c "/home/pi/desktop/test.sh"
第三步:reboot
4 总结
知识要点: ps命令,lsusb命令,grep 命令
核心一句话总结:grep用于配合其他shell命令使用,用于shell指令输出结果查找时,本质是长字符串中字串的查找和匹配,且需去除grep 查找串时,引入的字段。