树莓派智能家居:shell脚本之音乐列表

作者: lushitao 分类: 智能家居 发布时间: 2017-08-18 16:02

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基础很差所以有很多东西不知道,导致开发相当缓慢,也希望大神们能够多多指导,多谢多谢!

树莓派智能家居:shell脚本之音乐列表

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注