树莓派智能家居:shell脚本之音乐列表
Shell脚本也是一个玩转Linux非常有利的武器,好吧,其实我并不会……但是基于万种语言归于一宗的思想,学过程序设计的应该能很快入手。
由于我的目标是开发音乐播放器,所以就不采用传统的叙述方式来一步一步shell入门了,直接从应用角度开发,一步到位。
音乐播放器至少应该可以增删音乐文件,文件排序,随机播放,顺序播放,单曲循环。首先我们先从增删文件来入手。因为数据库的配置极其麻烦,所以我们把自己的配置文件写成txt文件,方便存取操作,那么如果想往我们的配置文件raspberry.txt里新添加一行数据怎么办呢?输入下面命令:
echo “music1.wav” >
raspberry.txt #表示清空文件后输入
echo “music2.wav” >> raspberry.txt #表示在文件尾部追加
查看文件内容呢?输入下面命令:
cat raspberry.txt
删除某一行呢?使用sed命令:
sed -i ‘2d’ raspberry.txt #注意,这里加-i与不加-i区别是,加-i能够修改raspberry.txt这个文件。不加只能在控制台显示并不修改raspberry.txt这个文件。2d表示第二行。
在这里我想稍微扩展一下sed这个命令,毕竟是一个非常强大的工具,可以匹配,替换,标记,甚至可以扩展脚本,这个大家可以自行百度一下sed命令,在这里我仅仅举几个特殊的例子。
sed -i ‘s/abc/ABC/g’ file.txt #把file.txt的abc全部替换成ABC
sed ‘/^abc/’d file.txt #把file.txt的以abc开头的行全部删除
sed -n ‘p;n’ file.txt #打印出奇数行
sed -n ‘n;p’ file.txt #打印出偶数行
好了,现在增删都可以实现了,那么我们就做一个脚本来通过命令自定义增加和删除音乐文件吧,脚本名字假设为ps.sh,内容如下:
#!/bin/bash
if [ “$1” == “add” ] && [ ! -d “$2” ]
then
path=$2
echo $2>>rasp.txt
echo “$2 has been add to playlist”
elif [ “$1” == “del” ] && [ ! -d “$2” ]
then
paths=$2
temp=${paths////\/}
sed -i “/^$temp/”d rasp.txt
echo “$2 has been delete from playlist”
else
echo “file not exist!”
fi
具体使用方法:
新增文件:sh ps.sh add /home/1.wav
删除文件:sh ps.sh del /home/1.wav
尽管这个如此简单的脚本,也是极其耗费心力,短短几句话花费了我至少6个小时的时间查资料、学习。下面我从这个脚本中所遇到的问题中来一个个讲解。
首先是shell脚本输入变量的接收,这个还是比较简单的,直接使用$1、$2……就能直接访问传入的参数,比如,sh ps.sh add /home/1.wav这句话中,add是$1,/home/1.wav是$2。
接下来便是判断语句,标准判断语句,if [ condition ] then; dosomething fi,其中[ ! -d “$2” ]表示第二个参数是否存在。
比较难的一点在于sed -i “/^$temp/”d rasp.txt这一句。首先sed如果直接在命令行里面敲代码我们都很容易理解如sed ‘/abc/d’ file.txt,直接写好一个字符串进行匹配或者删除,但是在shell脚本里并不能直接引用变量,即我不能写sed ‘/$var/d’ file.txt,因为单引号是硬解析,会认为$var是一个字符串而不是一个变量,所以在shell里面引用变量的方法有四种,以替换字符串为例:
1、eval sed ’s/$a/$b/’ filename
2、sed “s/$a/$b/” filename
3、sed ’s/’$a’/’$b’/’ filename
4、sed s/$a/$b/ filename
在这里我用的是第二种,双引号,双引号是软解析,会识别shell的变量,从而实现查找特定字符并删除这一行。
好了,到这里删除增加就完毕了,刚刚接触shell基础很差所以有很多东西不知道,导致开发相当缓慢,也希望大神们能够多多指导,多谢多谢!