我写得一个脚本管理器,希望大家指正。

sh/bash/dash/ksh/zsh等Shell脚本
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

我写得一个脚本管理器,希望大家指正。

#1

帖子 xiii_1991 » 2011-06-12 4:42

我是菜鸟,刚开始学习,也不知道做一个什么东西好,于是就编写了一个管理shell脚本的shell脚本……

详见附件,希望大家用一用,看一看,给点意见 :em11

里面有注释得,我自认为不是很混乱。 :em06

如果不想下载的话,我把内容贴在了15楼。
附件
script-man3.7z
脚本管理器
(2.51 KiB) 已下载 130 次
上次由 xiii_1991 在 2011-06-19 15:21,总共编辑 1 次。
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#2

帖子 xiii_1991 » 2011-06-12 17:48

:em06 怎么没有人理我。。。
头像
monk
帖子: 19507
注册时间: 2010-01-28 10:45

Re: 我写得一个脚本管理器,希望大家指正。

#3

帖子 monk » 2011-06-12 17:49

直接贴上来吧
还搞附件 :em06

*********宁静致远*********
如果我说的有什么不对,请看签名第一行
头像
icyomik
帖子: 76
注册时间: 2010-10-30 17:52

Re: 我写得一个脚本管理器,希望大家指正。

#4

帖子 icyomik » 2011-06-12 20:49

很清楚的注释。
个人博客:http://blog.jtwo.me/
女友淘宝:http://icykiss.taobao.com/
你有什么不开心的事情,说出来让大家开心一下。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 我写得一个脚本管理器,希望大家指正。

#5

帖子 sk1418 » 2011-06-12 21:47

作为练习挺好的。

不过实用性不是太高。(个人观点)
---
regards,

Kent
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 我写得一个脚本管理器,希望大家指正。

#6

帖子 lilydjwg » 2011-06-12 22:23

最讨厌交互式询问了,和微软平台上的“下一步”×N 以及各种 wizard 没什么区别,除了更丑之外。
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#7

帖子 xiii_1991 » 2011-06-13 0:56

monk 写了:直接贴上来吧
还搞附件 :em06
有点长啊。
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#8

帖子 xiii_1991 » 2011-06-13 0:57

sk1418 写了:作为练习挺好的。

不过实用性不是太高。(个人观点)
可以免去重复得输入一些命令啊,而且那个目录是设定到path的啊。
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#9

帖子 xiii_1991 » 2011-06-13 1:03

lilydjwg 写了:最讨厌交互式询问了,和微软平台上的“下一步”×N 以及各种 wizard 没什么区别,除了更丑之外。
我也 觉得不方便。其实我配套的有一个参数的版本。

我想改成没有参数就交互得,就像aptitude一样。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 我写得一个脚本管理器,希望大家指正。

#10

帖子 lilydjwg » 2011-06-13 1:07

xiii_1991 写了:
monk 写了:直接贴上来吧
还搞附件 :em06
有点长啊。
这里贴代码可以折叠的。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 我写得一个脚本管理器,希望大家指正。

#11

帖子 lilydjwg » 2011-06-13 1:08

xiii_1991 写了:
lilydjwg 写了:最讨厌交互式询问了,和微软平台上的“下一步”×N 以及各种 wizard 没什么区别,除了更丑之外。
我也 觉得不方便。其实我配套的有一个参数的版本。

我想改成没有参数就交互得,就像aptitude一样。
aptitude 有基于文本的界面,你这个连命令行界面都不是。。。
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#12

帖子 xiii_1991 » 2011-06-13 1:47

lilydjwg 写了:
xiii_1991 写了:
monk 写了:直接贴上来吧
还搞附件 :em06
有点长啊。
这里贴代码可以折叠的。
好的,4.0的时候我就 直接贴代码……
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#13

帖子 xiii_1991 » 2011-06-13 1:48

lilydjwg 写了:
xiii_1991 写了:
lilydjwg 写了:最讨厌交互式询问了,和微软平台上的“下一步”×N 以及各种 wizard 没什么区别,除了更丑之外。
我也 觉得不方便。其实我配套的有一个参数的版本。

我想改成没有参数就交互得,就像aptitude一样。
aptitude 有基于文本的界面,你这个连命令行界面都不是。。。
:em06 惭愧 惭愧
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 我写得一个脚本管理器,希望大家指正。

#14

帖子 cjxgm » 2011-06-13 10:39

[bash]echo "长也没关系啊"
echo "贴出来吧"
echo "不想下载"
echo -e "\033[01;32m======华丽的分割线======\033[0m"
echo "论坛不是还有这个功能吗?"
echo "用神马 [bash] 和 [/bash] 就行了"
[/bash]
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
xiii_1991
帖子: 47
注册时间: 2008-12-27 15:16

Re: 我写得一个脚本管理器,希望大家指正。

#15

帖子 xiii_1991 » 2011-06-14 0:22

cjxgm 写了:[bash]echo "长也没关系啊"
echo "贴出来吧"
echo "不想下载"
echo -e "\033[01;32m======华丽的分割线======\033[0m"
echo "论坛不是还有这个功能吗?"
echo "用神马 [bash] 和 [/bash] 就行了"
[/bash]
我试试看
我用不同的软件编辑过,所以有的地方缩进不一样
[bash]
#!/bin/sh
#文件名:script-man3.sh
#简介:第三代脚本管理器交互版。
#作者 xiii_1991
#创建时间:2011-01-23
#END
ver='3.5'
help(){
echo "Shell脚本管理程序 $ver"
echo "n 从模板新建脚本"
echo "e 使用 $editor 编辑脚本"
echo "x 给予/取消脚本运行权限"
echo "l 查看脚本列表"
echo "f 刷新脚本目录"
echo "m 查看脚本信息"
echo "r 重命名脚本文件"
echo "d 删除某脚本"
echo "b 备份现有的全部自定义脚本"
echo "rmtrash 清除内建回收站"
echo "clear 清屏幕"
echo "0 退出"
echo ""
}



#初始化
begin(){
clear
selfname="script-man3.sh" #自身得文件名
#filename=$0
myfunc="$HOME/myscripts" #保存所有脚本得目录

if [ -f $myfunc/.scriptmanrc ];then
owner="`awk '/^owner/{print $2}' "$myfunc/.scriptmanrc"`"
editor="`awk '/^editor/{print $2}' "$myfunc/.scriptmanrc"`"
else
echo "未发现设置文件,现在开始初始化。"
[ ! -d $myfunc ]&& mkdir $myfunc
echo "请输入您的称呼:\c";read owner
echo "owner $owner" >> $myfunc/.scriptmanrc

echo "请输入默认编辑器: \c";read editor
echo "editor $editor" >> $myfunc/.scriptmanrc

[ -f $selfname ]&& cp $selfname $myfunc/$selfname
touch $myfunc/模板文件
fi
[ "$myfunc" != "`pwd`" ]&& echo "注意:一切操作都在$myfunc里进行"
[ ! -d "$myfunc/backup" ]&& mkdir "$myfunc/backup"
[ ! -d "$myfunc/trash" ]&& mkdir "$myfunc/trash"

}

#错误处理
errorcode(){
case $error in
'1') echo "输入不能为空!" ;;
'2') echo "输入的文件已存在!" ;;
'3') echo "输入的文件不存在!" ;;
'4') echo "操作取消。" ;;
'5') echo "脚本目录文件不存在,请使用指令f创建。"
esac
}


#处理扩展名
nosh(){
file="$myfunc/${filename%%.*}.sh"
}

#从模板新建
new_sh(){
echo "请输入脚本文件名(不包含\".\"):\c";read filename
if [ -z $filename ];then error='1'
else
nosh
if [ -f $file ];then error='2'
else
echo "请输入一段说明:\c";read filememo
echo "#!/bin/sh" > $file
echo "#文件名 ${filename%%.*}.sh">>$file
echo "#作者 "${owner}"" >>$file
echo "#简介 $filememo">>$file
echo "#创建时间 `date +%F`">>$file
echo "#END">>$file
cat $myfunc/model >>$file
echo "新脚本 ${filename%%.*}创建完毕。可以使用指令e进行查看和编辑。"
fi
fi
}

#重命名
rename(){
echo "请输入脚本文件名(不包含扩展名):\c";read filename
if [ -z $filename ];then error='1'
else
nosh
if [ ! -f $file ];then error='3'
else
echo "请输入新名称:\c";read newname
newfile="$myfunc/${newname%%.*}.sh"
mv $file $newfile
#sed -n -e '/^#文件名/d;1a"#文件名 $newfile";w' $newfile
echo "${filename&&.*}已更名为${newname%%.*}"

fi
fi
}

#删除
del(){
echo "请输入脚本文件名(不包含扩展名):\c";read filename
if [ -z $filename ];then error='1'
else
nosh
if [ ! -f $file ];then error='3'
else
echo "即将删除${filename},请确认(y):\c";read choice
if [ "$choice" = 'y' ];then mv $file $myfunc/trash ; echo "${filename%%.*}.sh已移动至内建回收站。"
else error='4'
fi
fi
fi
}


#查看信息
memo(){
echo "请输入脚本文件名(不包含扩展名):\c";read filename
if [ -z $filename ];then error='1'
else
nosh
if [ ! -f $file ];then error='3'
else
echo "\n"
echo $file
echo "\n"
sed -n -e '1d;1,/#END/{/#END/d;s/#//;1,25p}' $file
line="`wc -l $file`"
sine="`sed -n -e '/#END/p' $file`"
echo "\n\n"
[ -z $sine ]&& echo "脚本没有可识别的注释标记。"
echo "脚本共有${line%% *}行"
[ ! -x $file ] && echo "没有运行权限"
fi
fi
}

#权限
x(){
echo "请输入脚本文件名(不包含扩展名):\c";read filename
if [ -z $filename ];then error='1'
else
nosh
if [ ! -f $file ];then error='3'
else
if [ -x $file ];then chmod -x $file;echo "${filename%%.*} 已取消运行权限。"
else chmod +x $file;echo "${filename%%.*} 已添加运行权限";fi
fi
fi
}


#gvim编辑
edit_it(){
echo "请输入脚本文件名(不包含扩展名):\c";read filename
if [ -z $filename ];then error='1'
else
nosh
if [ ! -f $file ];then error='3'
else
$editor $file
fi
fi
}


#刷新脚本目录
fresh(){
[ -f $myfunc/scriptlist ]&& rm $myfunc/scriptlist

for file in $myfunc/*.sh
do
date="`sed -n -e '/^#创建时间*/{s/#创建时间//;s/ //g;s/://g;s/://g;p}' $file`"
[ -z $date ]&&date='-'

owner="`sed -n -e '/^#作者*/{s/#作者//;p}' $file`"
[ -z $owner ]&&owner='-'

filen="${file##*/}"

line="`wc -l $file`"

ifx='-'
[ -x $file ]&& ifx='x'

echo "$filen $ifx $owner $date ${line%% *}" >> $myfunc/scriptlist
echo "$filen \c"
done
echo "脚本扫描完毕。"
}

#格式化显示目录
list(){
if [ -f $myfunc/scriptlist ];then
awk 'BEGIN{print "序号 文件名 权限 作者 创建日期 行数"}{printf("%4s %-20s [%1s] %-10s %-10s %4s \n",NR,$1,$2,$3,$4,$5)}END{print "\n 共有脚本" NR "个"}' $myfunc/scriptlist | more
echo "详细信息请使用指令m查看。"
else
error='5'
fi
}

#备份
backup(){

backname="myscripts-snapshot-`date +%m-%d-%k-%M`.tar.bz2"
[ -f "$myfunc/backup/$backname" ]&& rm "$myfunc/backup/$backname"
echo "即将备份全部自定义sh脚本。"
cd $myfunc
tar -cvpjf "backup/$backname" *.sh .scriptmanrc model

echo "全部脚本文件、配置文件、模板文件已备份为 $backname"
}


#清除回收站
rmtrash(){
echo "请输入YES,即将清空内建回收站。\c" ; read choice
if [ choice = 'YES' ] ; then
rm -rf $myfunc/trash
else
error='4'
fi
}

#main处理
main(){
error='0'
echo
echo "请输入操作指令:\c" ; read user
case $user in
'n') new_sh ;; #从模板新建脚本
'e') edit_it ;; #使用Gvim编辑脚本
'x') x ;; #给予/取消脚本运行权限
'l') list ;; #查看Shell脚本列表
'f') fresh ;; #刷新脚本目录
'm') memo ;; #查看脚本信息
'r') rename ;; #重命名脚本文件
'd') del ;; #删除某脚本
'b') backup ;; #备份现有的全部自定义脚本
'rmtrash') rmtrash ;; #清除内建回收站
'0') break ;;
'h') help ;;
'clear') clear ;;
*) echo "代码错误。输入h查看."
esac
}




#主程序
begin
loopp='1'
lock=$myfunc/script-man3.lock #加一个运行锁
if [ -f $lock ] ; then
echo "发现有另一个脚本管理器正在运行,请确认!!"
echo "也有可能是上一次没有正常退出,请删除 $lock 后再试。"
loopp='0'
echo "按Enter退出。" ; read ss
else
touch $lock
while [ $loopp = '1' ] ; do main ;errorcode ;done
rm $lock
fi


[/bash]
回复