sh/bash/dash/ksh/zsh等Shell脚本
-
ddrock
- 帖子: 10
- 注册时间: 2008-04-27 12:14
#1
帖子
由 ddrock » 2011-04-27 19:47
虽然很久前就知道ubuntu了,但是一直到这个月初才开始正是学习和使用,在win下习惯了自动更换壁纸的功能,在ubuntu下也能实现,但步骤有点繁琐,尤其是生成xml文件时,三五张图片无所谓,但是有上百张时就痛苦了,原来在win下用易语言变了个小程序生成xml文件,后来一想,既然决定使用ubuntu了,就要用ubuntu的方式来思考和解决问题,于是学习了一点shell的知识,编写了一下脚本,希望走过路过看过的都给提点意见,第一个脚本,不要笑话我……
代码开始:
代码: 全选
#!/bin/bash
# 此脚本用来实现ubuntu的自动更换壁纸的功能
# 准备工作:1.将要做背景的jpg图片集中到一个文件夹 2.脚本部分命令用sudo执行,需要输入密码 3.不须事先带参数,执行后有提示,按提示输入即可(也许带参数更方便)
# 为节省空间,此脚本是用软链接将装有图片的文件夹链接到ubuntu特定的背景文件夹下的,图片格式要jpg的(其他格式可在脚本中修改)
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
num=`echo $lj | wc -c`
num=`expr $num - 2`
zf=`echo $lj | cut -c 1 `
if [ "$zf" = "'" ];then
lj=`echo $lj | cut -c 2-$num`
fi
num=`echo $lj | wc -c`
num=`expr $num - 1`
zf=`echo $lj | cut -c $num `
if [ "$zf" = '/' ];then
num=`expr $num - 1`
lj=`echo $lj | cut -c 1-$num `
else
lj=${lj}
fi
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
i=2
string=`echo $lj | cut -d "/" -f$i `
until [ "$string" = "" ];do
string=`echo $lj | cut -d "/" -f$i `
i=`expr $i + 1`
done
i=`expr $i - 2`
mulu=`echo $lj | cut -d "/" -f$i `
# -------------以上代码取得路径的最后一个文件夹 如:/home/$user/background/ 将得到 background ,用以下面的创建链接
sudo ln -s $lj /usr/share/backgrounds/$mulu
#--------------------------------------------------------------------------
cat /usr/share/backgrounds/cosmos/background-1.xml | head > ${lj}/background-1.xml
echo "请输入每幅图片显示的时间(单位:秒):"
read t
x1="<static><duration>"
x2=".0</duration><file>"
x3="</file></static><transition><duration>5.0</duration><from>"
x4="</from><to>"
x5="</to></transition>"
i=1
n=`ls ${lj}/*.jpg | wc -l`
# 统计后缀为jpg的文件个数,即 循环的次数
while [ $i -le $n ]
do
name1=`ls /usr/share/backgrounds/${mulu}/*.jpg | head -n $i | tail -n 1`
# 依次得到第一第二第三……个文件的文件名(含绝对路径)
ii=`expr $i + 1`
if [ $ii -gt $n ];then
ii=1
fi
name2=`ls /usr/share/backgrounds/${mulu}/*.jpg | head -n $ii | tail -n 1`
echo $x1$t$x2$name1$x3$name1$x4$name2$x5 >> ${lj}/background-1.xml
i=`expr $i + 1`
done
echo "</background>" >> ${lj}/background-1.xml
#------------------------------------以上代码生成background-1.xml 文件,用以控制背景图片出现的顺序、停留的时间、以及置换时间
# x1后面跟显示时间,x2后面跟第一幅图的地址,x3后面也跟第一幅图的地址,x4后面跟第二幅图的地址,
sudo sed "/filename/s/cosmos/$mulu/g;s/宇宙/$mulu/g" /usr/share/gnome-background-properties/cosmos.xml > ${lj}/${mulu}.xml
sudo mv -f ${lj}/${mulu}.xml /usr/share/gnome-background-properties/
-
iamond
- 帖子: 719
- 注册时间: 2010-03-23 12:40
#2
帖子
由 iamond » 2011-04-27 21:51
虽然LZ说,用了UBUNTU就应该用UBUNTU的思维方式之类的话,说的是很对。。。不过ubuntu的思维方式应该不是指的一定要命令,要语言,要脚本 吧?
推荐LZ一个软件,wally,搜搜我的帖子,我以前推荐过的。。。可以自动换壁纸,可设置时间,平铺或者是居中,选择文件夹等等。。。功能比较完善,只是在11.04里不能在unity看到 图标。。。
I Kubuntu U
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#3
帖子
由 eexpress » 2011-04-27 23:13
lz sudo权限都还没解决嘛。
当练手吧
● 鸣学
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#4
帖子
由 fnan » 2011-04-29 3:41
练习bash不错的。
开头部分不用这么长吧:
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
lj=$(sed -E 's#^'"'"'|/*'"'"'*$##g' <<<$lj)
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
mulu=`echo $lj |tr "/" "\n"|tail -1`
# -------------以上代码取得路径的最后一个文件夹 如:/home/$user/background/ 将得到 background ,用以下面的创建链接
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
ddrock
- 帖子: 10
- 注册时间: 2008-04-27 12:14
#5
帖子
由 ddrock » 2011-04-29 18:59
iamond 写了:虽然LZ说,用了UBUNTU就应该用UBUNTU的思维方式之类的话,说的是很对。。。不过ubuntu的思维方式应该不是指的一定要命令,要语言,要脚本 吧?
推荐LZ一个软件,wally,搜搜我的帖子,我以前推荐过的。。。可以自动换壁纸,可设置时间,平铺或者是居中,选择文件夹等等。。。功能比较完善,只是在11.04里不能在unity看到 图标。。。
上网查了,下了,用了wally,确实不错。
ubuntu的思维方式应该不是指的一定要命令,要语言,要脚本 吧? 确实是,差点钻了牛角尖。
-
Boneflame
- 帖子: 420
- 注册时间: 2010-07-10 1:19
- 系统: 洗发水
- 来自: G+阿卡林部
-
联系:
#6
帖子
由 Boneflame » 2011-04-29 19:07
支持LZ!
懒人的话可以用desktop-nova

∧_∧::
(´・ω・`)::
/⌒ ⌒)::
/ へ__/ /::
(_\\ミ)/::
| `-イ::
/y )::
// /::
/ /::
( く:::
|\ ヽ:::
-
ddrock
- 帖子: 10
- 注册时间: 2008-04-27 12:14
#7
帖子
由 ddrock » 2011-04-30 18:45
开头部分不用这么长吧:
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
lj=$(sed -E 's#^'"'"'|/*'"'"'*$##g' <<<$lj)
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
代码执行出错了,请 fnan 检查下,感谢回帖及提出的改进,受启发,自己也改进了一下:
代码: 全选
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
num=`echo $lj | wc -c`
num=`expr $num - 2`
zf=`echo $lj | cut -c 1 `
if [ "$zf" = "'" ];then
lj=`echo $lj | cut -c 2-$num`
fi
num=`echo $lj | wc -c`
num=`expr $num - 1`
zf=`echo $lj | cut -c $num `
if [ "$zf" = '/' ];then
num=`expr $num - 1`
lj=`echo $lj | cut -c 1-$num `
else
lj=${lj}
fi
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
可以精简为以下两段代码:
代码: 全选
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
lj=`echo $lj | tr -d "'" `
# ----------------以上代码对输入的路径进行处理,去掉结尾的'(如果有的话)
代码: 全选
# name=`basename $lj`
# lj=`echo $lj | sed "s/${name}\//${name}/g" `
# ----------------以上代码对输入的路径进行处理,去掉结尾的/(如果有的话)
下面这段代码也可以精简:
代码: 全选
i=2
string=`echo $lj | cut -d "/" -f$i `
until [ "$string" = "" ];do
string=`echo $lj | cut -d "/" -f$i `
i=`expr $i + 1`
done
i=`expr $i - 2`
mulu=`echo $lj | cut -d "/" -f$i `
# -------------以上代码取得路径的最后一个文件夹 如:/home/$user/background/ 将得到 background ,用以下面的创建链接
精简为:
代码: 全选
mulu=`basename $lj`