夜半杂记 现已是凌晨一点,窗外的雨声使我不能入眠,湿润的空气让人略感烦躁,我躺在床上不断腾挪着位置,想细细地听听雨的声音,沙沙哑哑的,伴着细微的风,聚在一起敲打着墙面,轻拂过窗前。 这不禁让我有起来写些东西的念头。写些什么?我不知道。 滴滴答答的雨像是敲击着我灵魂的重锤,让我毫无睡意。在这以往 ,哪怕是风吹雷动我都是不愿意动一下眼皮的。或许是我多愁的种子又开始萌发了,它想在我的心里扎根,但我不能任其生长,这是不被我允许的,适时的掐断念想是我唯一的选择。我不能被情绪左右前行的抉择,前路漫漫,就算是披荆斩棘也是要承受的,这是成长,没有谁能替代。 这两天全哥回来处理一些事情,聊了很多。也许有些东西牵触了我的神经,使得我的想法波动,国庆前夕请假专程回来处理的并不是什么着急的事情,主要是想理顺和一个姑娘的关系,我猜测是为了避免十·一长假被人抢了先。就在今天,人家姑娘以加班为由回绝。虽然被姑娘拒绝了,但是事情算是理顺了,就不再有什么顾忌。一年多的交往人家姑娘不说明关系,而全哥和我一样处在一个很尴尬的年纪,家里人也想得到一个肯定的回复,施加了很大的压力,所以略微有些着急了。聊天的时候我常笑说全哥运气太差,遇到的都是出招就接而有没有下文的姑娘,礼物——收、约饭——吃、电影——看,然后就是拐弯抹角的坦诚关系,姑娘拐弯抹角的回避。其实我也很纳闷,为什么坦诚总是容易被戏耍,容易受到伤害。 转念想想自己,好上太多,最起码我喜欢的姑娘拒绝我很直接,干脆利落,别说我犯贱,我很欣赏这样脾性的姑娘,我也会很利索的答应不再打扰。当然,这于我来说,有极大可能是人家姑娘看不上我,不论是外貌还是思想,我觉得外貌占比较大,毕竟姑娘和我交流甚少,几乎可以忽略。 我喜欢过几个姑娘,有很多年,我也同样用了很多年去忘记,未遂。我得感谢时光,让我记得如此清晰,也许喜欢一个姑娘只需十分钟,而努力的去忘记用五百万分钟也未曾达到,这就是贱。 年前我在表妹的婚礼上遇到一姑娘,后来我称呼她大潘潘,这是我唯一主动的一回,我希望她能认识我,一切都丝毫不加掩饰,因为我不想欺瞒哄骗我喜欢的姑娘,那样我的灵魂会受到我内心的谴责,会感到不安和害怕失去,我希望我的坦诚能让姑娘认识一个真实、真真正正的我,然而并不能够。 毫无疑问,拒绝似乎是一种必然,这都还好,在我的想象之中,毕竟自己的斤两自己是清楚的,我不能应承我能力范围外的东西,如果可以,给我一些成长的时间,不会太久。一般来说这种虚无缥缈的东西是不值得相信的,所以,这是我对自己说的。 我不敢在感情上轻易下注,我怕我不够优秀,会让她失望。 记得我在一五年的时候给一姑娘说过,我认为的爱情应当是自然而然的,她说,祝福你。是的,我喜欢她。但是,我还很弱。 这让我想起了一句话,我在最窝囊的年纪里却遇见了最好年华的你,所以,只能放弃。 人生一世,不计过去,不畏将来,一人有一人的故事,一人有一人的酒。 妄尘集 2017-09-26 评论 1854 次浏览
孤独与自由,大风同烈酒 想写一些东西,埋头苦思半天,一个屁也没蹦出来。 于是,索性就啥也不想,提起笔铺上纸开始。 没有什么特别的东西写,我就反思反思,权当是再一次认识自己。 我不是一个优秀的人,只能混迹于普普通通的劳苦大众之中,默默的干着些事,以此来养活自己,是的,仅仅是养活自己。我并没有看不起劳苦大众的意思,只是为劳苦大众略感不值,干着苦累的活计,拿着比一些人工资零头还少的钱,而他们已然知足,因为有遮风避雨的栖身之所,有满堂儿女的欢笑之声。当然,感到不值只是一种心情,我也知道溜须拍马也算一种能力,毕竟也是有风险的。 写到这里,我想起了《侣行》中270说的那一句“并不是世界上没有战争,只是我们很辛运出生在了中国。”,为什么叫270就需要大家自行了解了,那是个不同寻常的故事。不相信就动手去查,欢迎查完了来讽刺我。同样的,也想起了片中那些被战火燎过的土地,想起了老挝那么大的一点地方炸弹的投放量过亿,三分之二以上的未爆弹催生出拆弹的职业,他们把拆下来的铝材制成餐具和工艺品,一场战争彻底改变了他们的生活方式,他们甚至不敢下地耕作,也许一锄头下去就让自己消失在这个世界上。 想起了那么多并不是说我要歌颂我们的国家多么的棒,只是想说,和平来之不易,如果你有经历过打靶,你会知道百米之外的一元硬币只是溅起点火花就那么的穿透了,如果那颗子弹打到并不是钢筋铁骨的血肉之躯上,能挡得住吗?把子弹按进弹匣压进枪膛的过程曾让我心情澎湃,也让我耳朵嗡鸣半晌。那黑黝黝的枪口若是对准我,我会害怕的,不论我曾经是不是一个战士,但是害怕并不能阻挡战争的铁蹄,唯有迎头予以痛击,消耗有生力量来换取希望。 我们生活在和平的环境下,且行且珍惜。 似乎扯得有点远,话题拉回来,上面说到了我不是一个优秀的人,但是我想成为一个优秀的人,成为一个自己觉得足够称得上优秀二字的人。我一直在艰难的前行着,同另一个自己抢夺这副身板的控制权,不时的失去控制权让我的神经紧绷,在这个并不适合安逸享乐的年纪里沉醉于现状而不自知实在是对自己的嘲笑。既然出生在一个没有战乱的国家,为什么不为自己的梦想拼搏,因为不用担心枪声突然地临近,不用担心下一餐能不能等得到,不用担心晚上没有地方躲避。 我在一本书里看到这么一句“你的问题,不是渴望功成名就,而是想要一夜暴富。” 成长的这个过程是绕不过去的,要怎么收获就得怎么去栽。 我常会遇到这样的场面,家里的长辈总会问女朋友找到没,我从不遮掩,实话实说的告诉他们,我自己都养不活,凭什么把人家拉过来体验生活的酸甜苦辣和柴米油盐的焦灼?凭所谓的爱情?我不相信。他们常会以“人家等你!”来驳回,我笑笑打个掩护岔开话。 我只是想在对的时间里遇到对的人,即使遇不到也没关系,我的生活依然得继续,并且向着梦想前行,也许我不能走的很快,但是我会爬的很认真,落后于人不可怕,甘于落后才是压死骆驼的最后那根稻草,本是翱翔于天际的雄鹰,非得混迹于三餐不愁的家禽队伍,算不算是自我放逐? 就用我在《苦行》里的句子来结尾: 学会与内心深处的你 对话 问问自己 想要怎样的人生 妄尘集 2017-07-18 评论 1854 次浏览
自用压缩解压缩工具测试加强版 ``` #!/bin/bash #Version:1.3.7 #Author:stone #Discription:compress & uncompress DIR|FILE #反思:经过解压缩模块的编码,在解压缩模块上可以反向借鉴,可以先获取用户输入的想要保存的文件名,从中过滤关键字进行判断 #######用户想要以何种方式压缩,如果用户没有键入后缀,那么以默认方式压缩,或者根据用户的要求直接当做文件名, #######也可在获取用户输入时设定规则,符合规则才进行下一步操作,此处使用正则去匹配用户输入。 #######解压缩模块过滤出来后,解压缩之前应当再次对文件类型进行判断,有压缩文件的后缀但不是压缩文件的不进行解压缩操作。 function cc() #cc(continue compress 继续压缩模块) { clear #清屏操作 echo -e "\033[32;1m压缩完成,请到$dirname下查看.\033[0m" #此处为打印字符提示 echo -e "\033[31m########################\033[0m" echo -e "\033[31m###\033[32;1m压缩已完成,请选择\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mh|H---回到首页----\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mq|Q------退出-----\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1m---回车默认退出---\033[0m\033[31m###\033[0m" echo -e "\033[31m########################\033[0m" echo -n -e "\033[33m请输入选项\033[0m" read chose2 #变量用于case语句的选择 if [ -n "$chose2" ]; then case $chose2 in h|H) continue 5 ;; q|Q) echo -e "\033[32;1m 你选择了退出\033[0m" echo -e "\033[32;1m脚本BUG时联系方式:吼\033[0m" exit 0 ;; *) echo -e "\033[32;1m由于你手指定位不准确,退出了脚本。\033[0m" echo -e "\033[32;1m脚本BUG时联系方式:吼\033[0m" exit 0 ;; esac else echo -e "\033[32;1m你选择了默认退出\033[0m" echo -e "\033[32;1m脚本BUG时联系方式:吼\033[0m" exit 0 fi } #输出的提示信息 clear #清屏操作 while :; do echo -e "\033[31m########################\033[0m" #此处为打印字符提示 echo -e "\033[31m###\033[32;1m 目标选择 \033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mc|C 压缩文件或目录\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mu|U 解压缩指定文件\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mq|Q 退出不执行脚本\033[0m\033[31m###\033[0m" echo -e "\033[31m########################\033[0m" echo -n -e "\033[33m请选择操作:\033[0m" read alpha1 #此处为首页case语句的变量 while :; do if [ "$alpha1" == "" ]; then #判断用户输入是否为空 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 elif [ "$alpha1" == "c" -o "$alpha1" == "C" ]; then #判断用户输入 echo -e "\033[31m##################################\033[0m" echo -e "\033[31m######\033[32;1m----你选择了压缩功能--\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1m--请指定文件存放目录--\033[0m\033[31m######\033[0m" echo -e "\033[31m##################################\033[0m" echo -n -e "\033[33m请输入需压缩文件或目录:\033[0m" read dir #获取目录变量,后期引用 elif [ "$alpha1" == "u" -o "$alpha1" == "U" ]; then #判断用户输入 con=0 #用户控制循环中该信息的再次显示 echo -e "\033[31m##################################\033[0m" echo -e "\033[31m######\033[32;1m--你选择了解压缩功能--\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1m--请指定文件存放目录--\033[0m\033[31m######\033[0m" echo -e "\033[31m##################################\033[0m" echo -n -e "\033[33m请输入需解压缩文件的绝对路径:\033[0m" read dir #获取压缩文件存放地址 elif [ "$alpha1" == "q" -o "$alpha1" == "Q" ]; then echo -e "\033[32;1m你选择了退出脚本,谢谢支持。\033[0m" echo -e "\033[33;1mBUG的联系方式:吼。\033[0m" exit 0 else echo -e "\033[31;1m请输入正确的选项。\033[0m" continue fi while :; do case $alpha1 in c|C) #压缩选项语句 if [ -n "$dir" ]; then #判断用户输入的目录是否为空 if [ -d $dir -o -f $dir ]; then #判断用户输入的是不是存在的文件或者目录 echo -e "\033[31m########################\033[0m" #打印提示界面 echo -e "\033[31m######\033[32;1m 格式选择 \033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1mj bzip2 压缩\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1mJ xz 压缩\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1mz gzip 压缩\033[0m\033[31m######\033[0m" echo -e "\033[31m#####\033[32;1mb|B 返回上一层\033[0m\033[31m#####\033[0m" echo -e "\033[31m########################\033[0m" echo -n -e "\033[33m请输入选择的压缩格式:\033[0m" read format1 #从键盘获取用户指定的压缩格式 case $format1 in #通过指定的格式进行下一步操作 j) dirname='/tmp' #设定默认压缩文件存放的路径/tmp filename=$(basename $dir) #取输入路径的基名,作为默认的文件名 clear #清屏操作 while :; do #以下为bzip2格式的压缩流程 echo -e "\033[31m###################################################\033[0m" echo -e "\033[31m#################\033[32;1m你选择了bzip2压缩\033[0m\033[31m#################\033[0m" echo -e "\033[31m###############\033[32;1my|Y-----默认bzip2压缩\033[0m\033[31m###############\033[0m" echo -e "\033[31m########\033[32;1mn|N文件名指定,不指定则默认原文件名\033[0m\033[31m########\033[0m" echo -e "\033[31m######\033[32;1md|D--存放路径指定,不指定则默认指向/tmp/\033[0m\033[31m######\033[0m" echo -e "\033[31m#################\033[32;1mb|B----返回上一层\033[0m\033[31m#################\033[0m" echo -e "\033[31m###################################################\033[0m" echo -n -e "\033[33m请输入选择:\033[0m" read chose1 #该变量用于case语句的选项 while :; do case $chose1 in "") #输入为空时的处理办法 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 ;; y|Y) #以默认选项或者指定好的选项进行压缩 cd $dirname #进入默认或者指定好的压缩目录 tar -jcvf ${filename}.tar.bz2 $dir &>/dev/null #以指定的方式进行压缩 if [ "$?" == "0" ]; then cc #调用函数模块 else echo -e "\033[31;1;5m很抱歉,由于未知原因,压缩未完成!\033[0m" exit 1 fi ;; n|N) #对压缩后的文件进行重命名 echo -n -e "\033[33m请输入文件名:\033[0m" read filename1 #从键盘获取用户指定的用户名 if [ -n "filename" ]; then #判断用户输入是否为空 filename2=$(echo $filename1 |sed -r 's/^[[:alpha:]](_?[[:alnum:]]_?)*//g') #将用户输入的信息进行过滤,并用于判断命名是否合理 if [ -z "$filename2" ]; then filename=$filename1 #当命名合理后,将用户键入的值赋值给filename,用于文件的命名。 echo -e "\033[32;1m你指定的名称为\033[33;1m$filename\033[32;1m,请选择压缩或者指定目录.\033[0m" #输出的提示信息 continue 2 #带变量值返回上一层 else echo -e "\033[31;1m请输入数字、字母下划线组成的文件名,且不能以数字下划线开头\033[0m" chose1=n #用户输入的值不合理时返回本case语句,重新输入 continue fi else echo -e "\033[31;1m文件名不能为空,请重新输入!\033[0m" chose1=n #用户键入空时返回本case语句,重新进行输入 continue fi ;; d|D) #压缩后文件存放目录的指定 echo -n -e "\033[33m请输入压缩包保存绝对路径:\033[0m" read dir1 #从键盘获取用户输入的值 if [ -n "$dir1" ]; then #判断用户是否键入空值 if [ -d $dir1 ]; then #判断用户键入的目录是否存在 dirname=$dir1 #如果目录存在则将用户键入的值赋值给dirname echo -e "\033[32;1m你指定的目录为\033[33;1m$dirname\033[32;1m,请选择压缩或者指定名称.\033[0m" #输出的信息提示 continue 2 #带变量值返回上一层 else echo -e "\033[31;1m你输入的目录不存在,请重新指定!\033[0m" chose1=d #当用户键入的目录不存在时返回本case语句重新输入 continue fi else echo -e "\033[31;1m目录不能为空,请重新指定!\033[0m" chose1=d #当用户键入空值的时候返回本层,重新进行目录的指定 continue fi ;; b|B) #返回上一级字符提示界面 continue 3 ;; *) echo -e "\033[31你的选择不符合要求,请重新选择\033[0m" continue 2 ;; esac done done ;; J) dirname='/tmp' #设定默认压缩文件存放的路径/tmp filename=$(basename $dir) #取输入路径的基名,作为默认的文件名 clear #清屏操作 while :; do #以下为字符提示界面 echo -e "\033[31m###################################################\033[0m" echo -e "\033[31m#################\033[32;1m你选择了--xz-压缩\033[0m\033[31m#################\033[0m" echo -e "\033[31m###############\033[32;1my|Y 确认使用--xz-压缩\033[0m\033[31m###############\033[0m" echo -e "\033[31m########\033[32;1mn|N文件名指定,不指定则默认原文件名\033[0m\033[31m########\033[0m" echo -e "\033[31m######\033[32;1md|D--存放路径指定,不指定则默认指向/tmp/\033[0m\033[31m######\033[0m" echo -e "\033[31m#################\033[32;1mb|B----返回上一层\033[0m\033[31m#################\033[0m" echo -e "\033[31m###################################################\033[0m" echo -n -e "\033[33m请输入选择:\033[0m" read chose1 #case语句选项变量 while :; do case $chose1 in "") #用户键入空值时的处理办法 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 ;; y|Y) #以用户指定的方式或默认的方式压缩 cd $dirname #切换到用户指定目录或者默认目录/tmp tar -Jcvf ${filename}.tar.xz $dir &>/dev/null #以指定的方式进行压缩 if [ "$?" == "0" ]; then #判断压缩是否成功 cc #调用函数模块 else echo -e "\033[31;1;5m很抱歉,由于未知原因,压缩未完成!\033[0m" exit 1 fi ;; n|N) #压缩文件的文件名指定 echo -n -e "\033[33m请输入文件名:\033[0m" read filename1 #从键盘获取用户键入文件名 if [ -n "$filename1" ]; then #判断用户是否键入了空值 filename2=$(echo $filename1 |sed -r 's/^[[:alpha:]](_?[[:alnum:]]_?)*//g') #对用户键入的非空值进行过滤 if [ -z "$filename2" ]; then #判断过滤是否成功 filename=$filename1 #成功则将用户键入的数据赋值给filename,用户文件名的指定 echo -e "\033[32;1m你指定的名称为\033[33;1m$filename\033[32;1m,请选择压缩或者指定目录.\033[0m" #打印提示 continue 2 else echo -e "\033[31;1m请输入数字、字母下划线组成的文件名,且不能以数字下划线开头\033[0m" #打印错误提示 chose1=n #给定本case语句的值,本返回重新指定名称 continue fi else echo -e "\033[31;1m文件名不能为空,请重新输入!\033[0m" chose1=n #用户键入空值时的解决办法 continue fi ;; d|D) #压缩文件存放目录的指定 echo -n -e "\033[33m请输入压缩包保存绝对路径:\033[0m" read dir1 #从键盘获取用户指定的路径 if [ -n "$dir1" ]; then #判断用户键入的值是否为空 if [ -d $dir1 ]; then #判断用户键入的目录是否存在 dirname=$dir1 #当用户键入的目录存时赋值给dirname,用于存放目录的指定 echo -e "\033[32;1m你指定的目录为\033[33;1m$dirname\033[32;1m,请选择压缩或者指定名称.\033[0m" #提示打印 continue 2 #带参数返回上一层 else echo -e "\033[31;1m你输入的目录不存在,请重新指定!\033[0m" chose1=d #目录不存在时的解决办法 continue fi else echo -e "\033[31;1m目录不能为空,请重新指定!\033[0m" chose1=d #用户输入为空值的解决办法 continue fi ;; b|B) #返回上一级字符提示界面 continue 3 ;; *) #用户键入其他无效选项的处理办法 echo -e "\033[31你的选择不符合要求,请重新选择\033[0m" continue 2 #返回上一层 ;; esac done done ;; z) #用户指定的压缩选项-gzip dirname='/tmp' #设定默认压缩文件存放的路径/tmp filename=$(basename $dir) #取输入路径的基名,作为默认的文件名 clear #清屏操作 while :; do #以下为用户指定方式压缩的流程 echo -e "\033[31m###################################################\033[0m" echo -e "\033[31m#################\033[32;1m你选择了 gzip压缩\033[0m\033[31m#################\033[0m" echo -e "\033[31m###############\033[32;1my|Y 确认使用 gzip压缩\033[0m\033[31m###############\033[0m" echo -e "\033[31m########\033[32;1mn|N文件名指定,不指定则默认原文件名\033[0m\033[31m########\033[0m" echo -e "\033[31m######\033[32;1md|D--存放路径指定,不指定则默认指向/tmp/\033[0m\033[31m######\033[0m" echo -e "\033[31m#################\033[32;1mb|B----返回上一层\033[0m\033[31m#################\033[0m" echo -e "\033[31m###################################################\033[0m" echo -n -e "\033[33m请输入选择:\033[0m" read chose1 #从键盘获取用户的选项 while :; do case $chose1 in "") #用户键入为空值的处理办法 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 #返回上一层 ;; y|Y) #以用户指定的方式或者默认方式执行 cd $dirname #切换到用户指定的目录下或者默认目录/tmp下 tar -zcvf ${filename}.tar.gz $dir &>/dev/null #以用户指定的方式进行压缩 if [ "$?" == "0" ]; then cc #调用函数模块 else echo -e "\033[31;1;5m很抱歉,由于未知原因,压缩未完成!\033[0m" exit 1 #执行不成功的处理办法 fi ;; n|N) #压缩文件名称的指定 echo -n -e "\033[33m请输入文件名:\033[0m" read filename1 #从键盘获取用户输入的名称 if [ -n "$filename1" ]; then #判断用户键入的是否为空值 filename2=$(echo $filename1 |sed -r 's/^[[:alpha:]](_?[[:alnum:]]_?)*//g') #对用户键入的值进行过滤操作 if [ -z "$filename2" ]; then #判断用户的输入是否合理 filename=$filename1 #合理时给变量赋值 echo -e "\033[32;1m你指定的名称为\033[33;1m$filename\033[32;1m,请选择压缩或者指定目录.\033[0m" #提示信息打印 continue 2 #带参数返回上一层级 else echo -e "\033[31;1m请输入数字、字母下划线组成的文件名,且不能以数字下划线开头\033[0m" chose1=n #用户输入不合理时的处理办法 continue #返回当前case语句继续输入 fi else echo -e "\033[31;1文件名不能为空,请重新指定\033[0m" chose1=n #用户键入为空的处理办法 continue #返回当前case语句继续输入 fi ;; d|D) #压缩包存放目录的指定 echo -n -e "\033[33m请输入压缩包保存绝对路径:\033[0m" read dir1 #从键盘获取用户的输入 if [ ! -z "$dir1" ]; then #判断用户的输入是否为空 if [ -d $dir1 ]; then #判断用户非空输入的目录是否存在 dirname=$dir1 #目录存在将用户输入赋值给dirname,用于压缩包目录的指定 echo -e "\033[32;1m你指定的目录为\033[33;1m$dirname\033[32;1m,请选择压缩或者指定名称.\033[0m" #提示信息打印 continue 2 #带参数返回上一层 else echo -e "\033[31;1m你输入的目录不存在,请重新指定!\033[0m" chose1=d #用户输入目录不存在时的处理办法 continue fi else echo -e "\033[31;1m目录不能为空,请重新指定!\033[0m" chose1=d #用户键入空值时的处理办法 continue fi ;; b|B) #返回上一级字符提示界面 continue 3 ;; *) #当用户键入其他无效选项时的处理办法 echo -e "\033[31你的选择不符合要求,请重新选择\033[0m" continue 2 ;; esac done done ;; b|B) #返回上一个字符提示界面 continue 2 ;; *) #用户键入其他无效选项时的处理办法 echo -e "\033[31;1m你输入的不是有效选项,请重新选择!\033[0m" continue ;; esac else echo -e "\033[31m你输入的文件或目录无效,请重新选择!\033[0m" alpha1=c #用户无效输入时的处理办法 continue 2 #返回上一层,重新进行选择 fi else echo -e "\033[31;1m输入不能为空,请重新选择!\033[0m" continue 2 #用户键入空值的处理办法 fi #返回上一层,重新进行选择 ;; u|U) #解压缩case分支语句 [ "$con" == "1" ] && clear #清屏操作,当变量con在循环内赋值后打开该段字符显示并从键盘获取用户输入 [ "$con" == "1" ] && echo -e "\033[31m##################################\033[0m" [ "$con" == "1" ] && echo -e "\033[31m######\033[32;1m--你选择了解压缩功能--\033[0m\033[31m######\033[0m" [ "$con" == "1" ] && echo -e "\033[31m######\033[32;1m--请指定文件存放目录--\033[0m\033[31m######\033[0m" [ "$con" == "1" ] && echo -e "\033[31m##################################\033[0m" [ "$con" == "1" ] && echo -n -e "\033[33m请输入需解压缩文件的绝对路径:\033[0m" [ "$con" == "1" ] && read dir #获取压缩文件存放地址 while :; do if [ ! -z "$dir" ]; then #判断用户键入是否为空值 if [ -d $dir ]; then #判断用户键入的目录是否存在 cd $dir tar1=($(ls -A |grep -E "(.*\..?t(gz|ar))|(.*(\.tar)?\.(gz|xz|bz2|zip))")) #匹配目录中存在的压缩包 if [ "${tar1[0]}" == "" ]; then #当目录下没有压缩包的处理办法,此处应当加选项,重新输入还是返回。 echo -e "\033[31;1m很抱歉,该目录下并没有能够识别的压缩文件!两秒后返回首页。\033[0m" sleep 2 continue 4 fi a=1 #用于每一行显示压缩包个数定义、用户输入时数值的限定。 for i in ${tar1[*]}; do #将获取到的压缩包显示到屏幕,供用户选择 echo -n -e "\033[31;1m$a-$i\033[0m " #打印编号后的压缩包名 d=$(($a%4)) #每一行定义四个 [ "$d" == "0" ] && echo "" #每一行满4个参数则换行 let a++ #每执行一次累加一次,用于压缩包个数的判断,也用于分行显示的限定 done echo "" #当压缩包显示结束后强制换行,避免长度不够时提示符紧靠参数 while :; do echo -e "\033[33m请输入需要解压缩包的序号(使用空格或单个特殊字符或单个字母隔开):\033[0m" read num1 #从键盘获取用户指定压缩包的序号 if [ ! -z "$num1" ]; then #判断用户是否键入了空值 num2=$(echo $num1 |sed -r "s/([[:space:]]|[[:alpha:]]|[[:punct:]])?(([0-9]{1,})([[:space:]]|[[:alpha:]]|[[:punct:]])?){1,}//g") #判断用户输入的数据是否有效 if [ -z "$num2" ]; then #判断用户的输入是否符合定义的标准 #需添加的功能:提取用户输入的数值 并进行判断大小,已经解压的不解压,即数字不能重复 num3=$(echo $num1 |awk -F "([[:space:]]|[[:alpha:]]|[[:punct:]])" '{printf NF}') #统计用户输入参数的个数 num4=1 #用于awk语句打印计数 for ((i=0;$i<$num3;i++)); do #循环将用户选择的数值放入数组中 num[$i]=$(echo $num1 |awk -F "([[:space:]]|[[:alpha:]]|[[:punct:]])" "{printf \$$num4}") #将用户输入的数字放入数组,打印时使用了变量嵌套 let num4++ #用于awk语句打印计数 done while :; do echo -e "\033[31;1m默认解压缩至/tmp目录\033[0m" echo -n -e "\033[33m请输入解压缩指定目录:\033[0m" read DIR #从键盘获取用户指定压缩文件解压后的存放目录 if [ ! -z "$DIR" ]; then #判断用户的键入是否每空值 if [ -d $DIR ]; then #判断用户输入的目录是否存在 echo -e "\033[32;1m你选择了\033[33m$DIR\033[32m作为解压缩目录!\033[0m" #提示打印 break #如果目录存在则跳出循环 else echo -e "\033[31;1m输入的路径不存在,请重新输入!\033[0m" continue #用户键入的目录不存在时,提示重新录入 fi else DIR='/tmp' #默认解压后存放路径为/tmp echo -e "\033[31;1m默认为/tmp目录。\033[0m" break #设定结束后退出循环 fi done for i in ${num[*]}; do #将用户数组的值与压缩文件数组的值关联起来 truenum=$(($i-1)) #用户输入的数比数组大1,因此每一个值减一 if [ $truenum -lt $a ]; then #比较用户的输入是否超过了过滤出的压缩文件数量 value1="tar1[$truenum]" #数组变量的嵌套 eval value=$(echo \${$value1}) #数组变量的嵌套 #应该先判断文件压缩类型 directory=$(echo $dir |sed -r "s/(.*)\/$/\1/g") #保证dir目录的一致性,用于压缩包绝对路径的指定 filename=$(echo "$value" |awk -F "(gz|xz|bz2|zip)" '{print $1}') #指定单一压缩文件保留原文件时,标准输出重定向时的文件名。 DIR=$(echo "$DIR" |sed -r "s/(.*)\/?$/\1\//g") #给目录加上/,固定目录的格式 tar2=$(echo $value |grep "tar") #过滤有tar关键字的文件 tar3=$(echo $value |grep ".gz") tar4=$(echo $value |grep ".xz") tar5=$(echo $value |grep ".bz2") tar6=$(echo $value |grep ".zip") if [ -n "tar2" ] ; then #过滤文件名中有tar关键字的包 tar -xf $directory/$value -C $DIR &>/dev/null #默认解压缩到/tmp目录下 if [ "$?" == "0" ]; then #判断解压缩是否成功 echo -e "\033[32;1m $value 解压缩成功.\033[0m" else echo -e "\033[31;1m非常抱歉,由于未知的原因,\033[33m$value\033[31解压缩未能顺利进行!\033[0m" fi elif [ -n "$tar3" ]; then #过滤文件名中有.gz的压缩包 gunzip $directory/$value -c >${DIR}${filename} &>/dev/null #gz压缩包的操作 if [ "$?" == "0" ]; then #判断解压缩是否成功 echo -e "\033[32;1m $value 解压缩成功.\033[0m" else echo -e "\033[31;1m非常抱歉,由于未知的原因,\033[33m$value\033[31解压缩未能顺利进行!\033[0m" fi elif [ -n "$tar4" ]; then #过滤文件名中有.xz的压缩包 unxz $directory/$value -c >${DIR}${filename} &>/dev/null #xz压缩包操作 if [ "$?" == "0" ]; then #判断解压缩是否成功 echo -e "\033[32;1m $value 解压缩成功.\033[0m" else echo -e "\033[31;1m非常抱歉,由于未知的原因,\033[33m$value\033[31解压缩未能顺利进行!\033[0m" fi elif [ -n "$tar5" ]; then #bzip2压缩包的解决办法 bunzip2 $directory/$value -c >${DIR}${filename} &>/dev/null if [ "$?" == "0" ]; then #判断解压缩是否成功 echo -e "\033[32;1m $value 解压缩成功.\033[0m" else echo -e "\033[31;1m非常抱歉,由于未知的原因,\033[33m$value\033[31解压缩未能顺利进行!\033[0m" fi elif [ -n "$tar6" ]; then #bzip2压缩包的解决办法 cd $directory/$value unzip $directory/$value &>/dev/null if [ "$?" == "0" ]; then #判断解压缩是否成功 echo -e "\033[32;1m $value 解压缩成功.\033[0m" else echo -e "\033[31;1m非常抱歉,由于未知的原因,\033[33m$value\033[31解压缩未能顺利进行!\033[0m" fi else #未识别压缩包的解决办法 echo -e "\033[32;1m很抱歉这个压缩包的类型没有添加。\033[0m" fi else echo -e "\033[31;1m你指定的解压序号\033[33m$i\033[31m不存在,没有进行解压缩。\033[0m" fi done sleep 2 #等待两秒 continue 5 #解压缩完成后返回第一个字符界面 else echo -e "\033[31;1m未能按照规定输入,请重新输入!\033[0m" continue fi else echo -e "\033[31;1m压缩包选择不能为空,请重新输入!\033[0m" continue fi done else echo -e "\033[31;1m输入不是有效目录,请重新输入!\033[0m" alpha1=u continue fi else con=1 #控制循环后字符的显示,以及从键盘获取用户键入信息 alpha1=u #给定本case语句的值,返回重新指定名称 echo -e "\033[31;1m输入不能为空,请重新输入!\033[0m" continue 2 fi done ;; *) echo -e "\033[31;1m你的输入不符合要求,请再次输入!\033[0m" continue ;; esac done done done ``` shell脚本 2017-07-03 评论 2611 次浏览
自用压缩解压缩工具测试版 ``` #!/bin/bash #Version:1.3.7 #Author:stone #Discription:compress & uncompress DIR|FILE function cc() #cc(continue compress 继续压缩模块) { clear #清屏操作 echo -e "\033[32;1m压缩完成,请到$dirname下查看.\033[0m" #此处为打印字符提示 echo -e "\033[31m########################\033[0m" echo -e "\033[31m###\033[32;1m压缩已完成,请选择\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mh|H---回到首页----\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mq|Q------退出-----\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1m---回车默认退出---\033[0m\033[31m###\033[0m" echo -e "\033[31m########################\033[0m" echo -n -e "\033[33m请输入选项\033[0m" read chose2 #变量用于case语句的选择 if [ -n "$chose2" ]; then case $chose2 in h|H) continue 4 ;; q|Q) echo -e "\033[32;1m 你选择了退出\033[0m" echo -e "\033[32;1m脚本BUG时联系方式:吼\033[0m" exit 0 ;; *) echo -e "\033[32;1m由于你手指定位不准确,退出了脚本。\033[0m" echo -e "\033[32;1m脚本BUG时联系方式:吼\033[0m" exit 0 ;; esac else echo -e "\033[32;1m你选择了默认退出\033[0m" echo -e "\033[32;1m脚本BUG时联系方式:吼\033[0m" exit 0 fi } #输出的提示信息 clear #清屏操作 while :; do echo -e "\033[31m########################\033[0m" #此处为打印字符提示 echo -e "\033[31m###\033[32;1m 目标选择 \033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mc|C 压缩文件或目录\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mu|U 解压缩指定文件\033[0m\033[31m###\033[0m" echo -e "\033[31m###\033[32;1mq|Q 退出不执行脚本\033[0m\033[31m###\033[0m" echo -e "\033[31m########################\033[0m" echo -n -e "\033[33m请选择操作:\033[0m" read alpha1 #此处为首页case语句的变量 while :; do if [ "$alpha1" == "" ]; then #判断用户输入是否为空 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 elif [ "$alpha1" == "c" -o "$alpha1" == "C" ]; then #判断用户输入 echo -e "\033[31m##################################\033[0m" echo -e "\033[31m######\033[32;1m----你选择了压缩功能--\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1m--请指定文件存放目录--\033[0m\033[31m######\033[0m" echo -e "\033[31m##################################\033[0m" echo -n -e "\033[33m请输入需压缩文件或目录:\033[0m" read dir #获取目录变量,后期引用 elif [ "$alpha1" == "u" -o "$alpha1" == "U" ]; then #判断用户输入 con=0 #用户控制循环中该信息的再次显示 echo -e "\033[31m##################################\033[0m" echo -e "\033[31m######\033[32;1m--你选择了解压缩功能--\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1m--请指定文件存放目录--\033[0m\033[31m######\033[0m" echo -e "\033[31m##################################\033[0m" echo -n -e "\033[33m请输入需解压缩文件的绝对路径:\033[0m" read dir #获取压缩文件存放地址 elif [ "$alpha1" == "q" -o "$alpha1" == "Q" ]; then echo -e "\033[32;1m你选择了退出脚本,谢谢支持。\033[0m" echo -e "\033[33;1mBUG的联系方式:吼。\033[0m" exit 0 else echo -e "\033[31;1m请输入正确的选项。\033[0m" continue fi while :; do case $alpha1 in c|C) #压缩选项语句 if [ -n "$dir" ]; then #判断用户输入的目录是否为空 if [ -d $dir -o -f $dir ]; then #判断用户输入的是不是存在的文件或者目录 echo -e "\033[31m########################\033[0m" #打印提示界面 echo -e "\033[31m######\033[32;1m 格式选择 \033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1mj bzip2 压缩\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1mJ xz 压缩\033[0m\033[31m######\033[0m" echo -e "\033[31m######\033[32;1mz gzip 压缩\033[0m\033[31m######\033[0m" echo -e "\033[31m#####\033[32;1mb|B 返回上一层\033[0m\033[31m#####\033[0m" echo -e "\033[31m########################\033[0m" echo -n -e "\033[33m请输入选择的压缩格式:\033[0m" read format1 #从键盘获取用户指定的压缩格式 case $format1 in #通过指定的格式进行下一步操作 j) dirname='/tmp' #设定默认压缩文件存放的路径/tmp filename=$(basename $dir) #取输入路径的基名,作为默认的文件名 clear #清屏操作 while :; do #以下为bzip2格式的压缩流程 echo -e "\033[31m###################################################\033[0m" echo -e "\033[31m#################\033[32;1m你选择了bzip2压缩\033[0m\033[31m#################\033[0m" echo -e "\033[31m###############\033[32;1my|Y-----默认bzip2压缩\033[0m\033[31m###############\033[0m" echo -e "\033[31m########\033[32;1mn|N文件名指定,不指定则默认原文件名\033[0m\033[31m########\033[0m" echo -e "\033[31m######\033[32;1md|D--存放路径指定,不指定则默认指向/tmp/\033[0m\033[31m######\033[0m" echo -e "\033[31m#################\033[32;1mb|B----返回上一层\033[0m\033[31m#################\033[0m" echo -e "\033[31m###################################################\033[0m" echo -n -e "\033[33m请输入选择:\033[0m" read chose1 #该变量用于case语句的选项 while :; do case $chose1 in "") #输入为空时的处理办法 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 ;; y|Y) #以默认选项或者指定好的选项进行压缩 cd $dirname #进入默认或者指定好的压缩目录 tar -jcvf ${filename}.tar.bz2 $dir &>/dev/null #以指定的方式进行压缩 if [ "$?" == "0" ]; then cc #调用函数模块 else echo -e "\033[31;1;5m很抱歉,由于未知原因,解压缩未完成!\033[0m" exit 1 fi ;; n|N) #对压缩后的文件进行重命名 echo -n -e "\033[33m请输入文件名:\033[0m" read filename1 #从键盘获取用户指定的用户名 if [ -n "filename" ]; then #判断用户输入是否为空 filename2=$(echo $filename1 |sed -r 's/^[[:alpha:]](_?[[:alnum:]]_?)*//g') #将用户输入的信息进行过滤,并用于判断命名是否合理 if [ -z "$filename2" ]; then filename=$filename1 #当命名合理后,将用户键入的值赋值给filename,用于文件的命名。 echo -e "\033[32;1m你指定的名称为\033[33;1m$filename\033[32;1m,请选择压缩或者指定目录.\033[0m" #输出的提示信息 continue 2 #带变量值返回上一层 else echo -e "\033[31;1m请输入数字、字母下划线组成的文件名,且不能以数字下划线开头\033[0m" chose1=n #用户输入的值不合理时返回本case语句,重新输入 continue fi else echo -e "\033[31;1m文件名不能为空,请重新输入!\033[0m" chose1=n #用户键入空时返回本case语句,重新进行输入 continue fi ;; d|D) #压缩后文件存放目录的指定 echo -n -e "\033[33m请输入压缩包保存绝对路径:\033[0m" read dir1 #从键盘获取用户输入的值 if [ -n "$dir1" ]; then #判断用户是否键入空值 if [ -d $dir1 ]; then #判断用户键入的目录是否存在 dirname=$dir1 #如果目录存在则将用户键入的值赋值给dirname echo -e "\033[32;1m你指定的目录为\033[33;1m$dirname\033[32;1m,请选择压缩或者指定名称.\033[0m" #输出的信息提示 continue 2 #带变量值返回上一层 else echo -e "\033[31;1m你输入的目录不存在,请重新指定!\033[0m" chose1=d #当用户键入的目录不存在时返回本case语句重新输入 continue fi else echo -e "\033[31;1m目录不能为空,请重新指定!\033[0m" chose1=d #当用户键入空值的时候返回本层,重新进行目录的指定 continue fi ;; b|B) #返回上一级字符提示界面 continue 3 ;; *) echo -e "\033[31你的选择不符合要求,请重新选择\033[0m" continue 2 ;; esac done done ;; J) dirname='/tmp' #设定默认压缩文件存放的路径/tmp filename=$(basename $dir) #取输入路径的基名,作为默认的文件名 clear #清屏操作 while :; do #以下为字符提示界面 echo -e "\033[31m###################################################\033[0m" echo -e "\033[31m#################\033[32;1m你选择了--xz-压缩\033[0m\033[31m#################\033[0m" echo -e "\033[31m###############\033[32;1my|Y 确认使用--xz-压缩\033[0m\033[31m###############\033[0m" echo -e "\033[31m########\033[32;1mn|N文件名指定,不指定则默认原文件名\033[0m\033[31m########\033[0m" echo -e "\033[31m######\033[32;1md|D--存放路径指定,不指定则默认指向/tmp/\033[0m\033[31m######\033[0m" echo -e "\033[31m#################\033[32;1mb|B----返回上一层\033[0m\033[31m#################\033[0m" echo -e "\033[31m###################################################\033[0m" echo -n -e "\033[33m请输入选择:\033[0m" read chose1 #case语句选项变量 while :; do case $chose1 in "") #用户键入空值时的处理办法 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 ;; y|Y) #以用户指定的方式或默认的方式压缩 cd $dirname #切换到用户指定目录或者默认目录/tmp tar -Jcvf ${filename}.tar.xz $dir &>/dev/null #以指定的方式进行压缩 if [ "$?" == "0" ]; then #判断压缩是否成功 cc #调用函数模块 else echo -e "\033[31;1;5m很抱歉,由于未知原因,解压缩未完成!\033[0m" exit 1 fi ;; n|N) #压缩文件的文件名指定 echo -n -e "\033[33m请输入文件名:\033[0m" read filename1 #从键盘获取用户键入文件名 if [ -n "$filename1" ]; then #判断用户是否键入了空值 filename2=$(echo $filename1 |sed -r 's/^[[:alpha:]](_?[[:alnum:]]_?)*//g') #对用户键入的非空值进行过滤 if [ -z "$filename2" ]; then #判断过滤是否成功 filename=$filename1 #成功则将用户键入的数据赋值给filename,用户文件名的指定 echo -e "\033[32;1m你指定的名称为\033[33;1m$filename\033[32;1m,请选择压缩或者指定目录.\033[0m" #打印提示 continue 2 else echo -e "\033[31;1m请输入数字、字母下划线组成的文件名,且不能以数字下划线开头\033[0m" #打印错误提示 chose1=n #给定本case语句的值,本返回重新指定名称 continue fi else echo -e "\033[31;1m文件名不能为空,请重新输入!\033[0m" chose1=n #用户键入空值时的解决办法 continue fi ;; d|D) #压缩文件存放目录的指定 echo -n -e "\033[33m请输入压缩包保存绝对路径:\033[0m" read dir1 #从键盘获取用户指定的路径 if [ -n "$dir1" ]; then #判断用户键入的值是否为空 if [ -d $dir1 ]; then #判断用户键入的目录是否存在 dirname=$dir1 #当用户键入的目录存时赋值给dirname,用于存放目录的指定 echo -e "\033[32;1m你指定的目录为\033[33;1m$dirname\033[32;1m,请选择压缩或者指定名称.\033[0m" #提示打印 continue 2 #带参数返回上一层 else echo -e "\033[31;1m你输入的目录不存在,请重新指定!\033[0m" chose1=d #目录不存在时的解决办法 continue fi else echo -e "\033[31;1m目录不能为空,请重新指定!\033[0m" chose1=d #用户输入为空值的解决办法 continue fi ;; b|B) #返回上一级字符提示界面 continue 3 ;; *) #用户键入娶她无效选项的处理办法 echo -e "\033[31你的选择不符合要求,请重新选择\033[0m" continue 2 #返回上一层 ;; esac done done ;; z) #用户指定的压缩选项-gzip dirname='/tmp' #设定默认压缩文件存放的路径/tmp filename=$(basename $dir) #取输入路径的基名,作为默认的文件名 clear #清屏操作 while :; do #以下为用户指定方式压缩的流程 echo -e "\033[31m###################################################\033[0m" echo -e "\033[31m#################\033[32;1m你选择了 gzip压缩\033[0m\033[31m#################\033[0m" echo -e "\033[31m###############\033[32;1my|Y 确认使用 gzip压缩\033[0m\033[31m###############\033[0m" echo -e "\033[31m########\033[32;1mn|N文件名指定,不指定则默认原文件名\033[0m\033[31m########\033[0m" echo -e "\033[31m######\033[32;1md|D--存放路径指定,不指定则默认指向/tmp/\033[0m\033[31m######\033[0m" echo -e "\033[31m#################\033[32;1mb|B----返回上一层\033[0m\033[31m#################\033[0m" echo -e "\033[31m###################################################\033[0m" echo -n -e "\033[33m请输入选择:\033[0m" read chose1 #从键盘获取用户的选项 while :; do case $chose1 in "") #用户键入为空值的处理办法 echo -e "\033[31;1m输入不能为空,请重新输入\033[0m" continue 2 #返回上一层 ;; y|Y) #以用户指定的方式或者默认方式执行 cd $dirname #切换到用户指定的目录下或者默认目录/tmp下 tar -zcvf ${filename}.tar.gz $dir &>/dev/null #以用户指定的方式进行压缩 if [ "$?" == "0" ]; then cc #调用函数模块 else echo -e "\033[31;1;5m很抱歉,由于未知原因,解压缩未完成!\033[0m" exit 1 #执行不成功的处理办法 fi ;; n|N) #压缩文件名称的指定 echo -n -e "\033[33m请输入文件名:\033[0m" read filename1 #从键盘获取用户输入的名称 if [ -n "$filename1" ]; then #判断用户键入的是否为空值 filename2=$(echo $filename1 |sed -r 's/^[[:alpha:]](_?[[:alnum:]]_?)*//g') #对用户键入的值进行过滤操作 if [ -z "$filename2" ]; then #判断用户的输入是否合理 filename=$filename1 #合理时给变量赋值 echo -e "\033[32;1m你指定的名称为\033[33;1m$filename\033[32;1m,请选择压缩或者指定目录.\033[0m" #提示信息打印 continue 2 #带参数返回上一层级 else echo -e "\033[31;1m请输入数字、字母下划线组成的文件名,且不能以数字下划线开头\033[0m" chose1=n #用户输入不合理时的处理办法 continue #返回当前case语句继续输入 fi else echo -e "\033[31;1文件名不能为空,请重新指定\033[0m" chose1=n #用户键入为空的处理办法 continue #返回当前case语句继续输入 fi ;; d|D) #压缩包存放目录的指定 echo -n -e "\033[33m请输入压缩包保存绝对路径:\033[0m" read dir1 #从键盘获取用户的输入 if [ ! -z "$dir1" ]; then #判断用户的输入是否为空 if [ -d $dir1 ]; then #判断用户非空输入的目录是否存在 dirname=$dir1 #目录存在将用户输入赋值给dirname,用于压缩包目录的指定 echo -e "\033[32;1m你指定的目录为\033[33;1m$dirname\033[32;1m,请选择压缩或者指定名称.\033[0m" #提示信息打印 continue 2 #带参数返回上一层 else echo -e "\033[31;1m你输入的目录不存在,请重新指定!\033[0m" chose1=d #用户输入目录不存在时的处理办法 continue fi else echo -e "\033[31;1m目录不能为空,请重新指定!\033[0m" chose1=d #用户键入空值时的处理办法 continue fi ;; b|B) #返回上一级字符提示界面 continue 3 ;; *) #当用户键入其他无效选项时的处理办法 echo -e "\033[31你的选择不符合要求,请重新选择\033[0m" continue 2 ;; esac done done ;; b|B) #返回上一个字符提示界面 continue 2 ;; *) #用户键入其他无效选项时的处理办法 echo -e "\033[31;1m你输入的不是有效选项,请重新选择!\033[0m" continue ;; esac else echo -e "\033[31m你输入的文件或目录无效,请重新选择!\033[0m" alpha1=c #用户无效输入时的处理办法 continue 2 #返回上一层,重新进行选择 fi else echo -e "\033[31;1m输入不能为空,请重新选择!\033[0m" continue 2 #用户键入空值的处理办法 fi #返回上一层,重新进行选择 ;; u|U) #解压缩case分支语句 [ "$con" == "1" ] && clear #清屏操作 [ "$con" == "1" ] && echo -e "\033[31m##################################\033[0m" [ "$con" == "1" ] && echo -e "\033[31m######\033[32;1m--你选择了解压缩功能--\033[0m\033[31m######\033[0m" [ "$con" == "1" ] && echo -e "\033[31m######\033[32;1m--请指定文件存放目录--\033[0m\033[31m######\033[0m" [ "$con" == "1" ] && echo -e "\033[31m##################################\033[0m" [ "$con" == "1" ] && echo -n -e "\033[33m请输入需解压缩文件的绝对路径:\033[0m" [ "$con" == "1" ] && read dir #获取压缩文件存放地址 while :; do if [ ! -z "$dir" ]; then #判断用户键入是否为空值 if [ -d $dir ]; then #判断用户键入的目录是否存在 cd $dir tar1=($(ls -A |grep -E "(.*\..?tar.?)|(.*(\.tar)?\.(gz|xz|bz2))")) #匹配目录中存在的压缩包 if [ "${tar1[0]}" == "" ]; then #当目录下没有压缩包的处理办法,此处应当加选项,重新输入还是返回。 echo -e "\033[31;1m很抱歉,该目录下并没有能够识别的压缩文件!两秒后返回首页。\033[0m" sleep 2 continue 4 fi a=1 #用于每一行显示压缩包个数定义、用户输入时数值的限定。 for i in ${tar1[*]}; do #将获取到的压缩包显示到屏幕,供用户选择 echo -n -e "\033[31;1m$a-$i\033[0m " #打印编号后的压缩包名 d=$(($a%4)) #每一行定义四个 [ "$d" == "0" ] && echo "" #每一行满4个参数则换行 let a++ #每执行一次累加一次,用于压缩包个数的判断,也用于分行显示的限定 done echo "" #当压缩包显示结束后强制换行,避免长度不够时提示符紧靠参数 while :; do echo -e "\033[33m请输入需要解压缩包的序号(使用空格或单个特殊字符或单个字母隔开):\033[0m" read num1 #从键盘获取用户指定压缩包的序号 if [ ! -z "$num1" ]; then #判断用户是否键入了空值 num2=$(echo $num1 |sed -r "s/([[:space:]]|[[:alpha:]]|[[:punct:]])?(([0-9]{1,})([[:space:]]|[[:alpha:]]|[[:punct:]])?){1,}//g") #判断用户输入的数据是否有效 if [ -z "$num2" ]; then #判断用户的输入是否符合定义的标准 #需添加的功能:提取用户输入的数值 并进行判断大小,已经解压的不解压,即数字不能重复 num3=$(echo $num1 |awk -F "([[:space:]]|[[:alpha:]]|[[:punct:]])" '{printf NF}') #统计用户输入参数的个数 num4=1 #用于awk语句打印计数 for ((i=0;$i<$num3;i++)); do #循环将用户选择的数值放入数组中 num[$i]=$(echo $num1 |awk -F "([[:space:]]|[[:alpha:]]|[[:punct:]])" "{printf \$$num4}") #将用户输入的数字放入数组,打印时使用了变量嵌套 let num4++ #用于awk语句打印计数 done while :; do echo -e "\033[31;1m默认解压缩至/tmp目录\033[0m" echo -n -e "\033[33m请输入解压缩指定目录:\033[0m" read DIR #从键盘获取用户指定压缩文件解压后的存放目录 if [ ! -z "$DIR" ]; then #判断用户的键入是否每空值 if [ -d $DIR ]; then #判断用户输入的目录是否存在 echo -e "\033[32;1m你选择了\033[33m$DIR\033[32m作为解压缩目录!\033[0m" #提示打印 break #如果目录存在则跳出循环 else echo -e "\033[31;1m输入的路径不存在,请重新输入!\033[0m" continue #用户键入的目录不存在时,提示重新录入 fi else DIR='/tmp' #默认解压后存放路径为/tmp echo -e "\033[31;1m默认为/tmp目录。\033[0m" break #设定结束后退出循环 fi done for i in ${num[*]}; do #将用户数组的值与压缩文件数组的值关联起来 truenum=$(($i-1)) #用户输入的数比数组大1,因此每一个值减一 if [ $truenum -lt $a ]; then #比较用户的输入是否超过了过滤出的压缩文件数量 value1="tar1[$truenum]" #数组变量的嵌套 eval value=$(echo \${$value1}) #数组变量的嵌套 #应该先判断文件压缩类型 directory=$(echo $dir |sed -r "s/(.*)\/$/\1/g") #保证dir目录的一致性,用于压缩包绝对路径的指定 filename=$(echo "$value" |awk -F "(gz|xz|bz2)" '{print $1}') #指定单一压缩文件保留原文件时,标准输出重定向时的文件名。 DIR=$(echo "$DIR" |sed -r "s/(.*)\/?$/\1\//g") #给目录加上/,固定目录的格式 tar2=$(echo $value |grep "tar") #过滤有tar关键字的文件 tar3=$(echo $value |grep ".gz") tar4=$(echo $value |grep ".xz") tar5=$(echo $value |grep ".bz2") if [ "$tar2" == "0" ] ; then #过滤文件名中有tar关键字的包 tar -xf $directory/$value -C $DIR &>/dev/null #默认解压缩到/tmp目录下 elif [ "$tar3" == "0" ]; then #过滤文件名中有.gz的压缩包 gunzip $directory/$value -c >${DIR}${filename} &>/dev/null #gz压缩包的操作 elif [ "$tar4" == "0" ]; then #过滤文件名中有.xz的压缩包 unxz $directory/$value -c >${DIR}${filename} &>/dev/null #xz压缩包操作 elif [ "$tar5" == "0" ]; then #bzip2压缩包的解决办法 bunzip2 $directory/$value -c >${DIR}${filename} &>/dev/null else #未识别压缩包的解决办法 echo -e "\033[32;1m很抱歉这个压缩包的类型没有添加。\033[0m" fi if [ "$?" == "0" ]; then #判断解压缩是否成功 echo -e "\033[32;1m $value 解压缩成功.\033[0m" else echo -e "\033[31;1m非常抱歉,由于未知的原因,\033[33m$value\033[31解压缩未能顺利进行!\033[0m" fi else echo -e "\033[31;1m你指定的解压序号\033[33m$i\033[31m不存在,没有进行解压缩。\033[0m" fi done echo -e "\033[32;1m解压缩成功.\033[0m" sleep 2 #等待两秒 continue 4 #解压缩完成后返回第一个字符界面 else echo -e "\033[31;1m未能按照规定输入,请重新输入!\033[0m" continue fi else echo -e "\033[31;1m压缩包选择不能为空,请重新输入!\033[0m" continue fi done else echo -e "\033[31;1m输入不是有效目录,请重新输入!\033[0m" alpha1=u continue fi else con=1 #控制循环后字符的显示,以及从键盘获取用户键入信息 alpha1=u #给定本case语句的值,返回重新指定名称 echo -e "\033[31;1m输入不能为空,请重新输入!\033[0m" continue 2 fi done ;; *) echo -e "\033[31;1m你的输入不符合要求,请再次输入!\033[0m" continue ;; esac done done done ``` shell脚本 2017-06-29 评论 2639 次浏览
向着远方独自流浪 我通常喜欢坐在窗外一片漆黑的窗前,就着各种小虫儿的鸣叫,提笔在雪白的纸上鬼画符。 当我写到这句话的时,我看到前面的两行歪来扭去的字就有一种把自己拖出去枪毙十分钟的愤怒,一个人咋能把字写得这么丑……当然,我是不可能把自己就这么轻轻松松就干掉的,所以我还是得继续愤怒下去,直到文末。 最近一段时间看到各色的景脑子就会不受控制的冒出一句词或一句诗,我暗自好笑,那几年死命背也记不住几句,现在倒好,看到个河都能想起“孤帆远影碧空尽,唯见长江天际流”,那个时刻我内心的阴影面积已无法计算,难道我的大脑被这些玩意儿霸占了?很显然,并没有,因为我还坐在窗前听着叽叽歪歪的虫鸣,写些让纸都想自焚的字,在此,我要向我的眼睛道歉,向我手中的笔道歉,向平铺在桌面上的纸道歉,因为你们还要承受我无尽岁月的折磨。 学习是一件极其枯燥乏味的事情,所以时常停下来看看自己迷茫的模样就会明白,无论多么的枯燥,都得继续。也许,这就像以前上什么马基还是毛概课上讲的,理想基于现实却又高于现实。看得见,靠努力能达到,这便是对自身的鞭策。成长这件事只能靠自己,这个过程没人能够代替,而成长的过程是孤独的。时常有朋友说我不合群,饭局不去,聚会不去,玩乐不去,说我什么都没有经历过,我开玩笑说,那不叫经历,只能叫经过,经历是一种成长,经过随时都可以有。我们正处于经历的阶段,却沉醉于经过,其实我很想问,曾经的梦想还记得吗?时间一晃,90后已经撑起一片天,我是90后,但并没有…… 也许当时间这个大魔术师再次变幻时,你我已是两鬓斑白,我只是不想让那个时候的自己太过惋惜,我希望那时候不是和几个同龄人漫无目的的吹牛,说自己当年泡过多少妞,喝过多少酒,花过多少钱,开过多少次房,打过多少次架。 干活的时候和朋友聊天,有时我会说到两句口头禅“论学习的重要性”“论锻炼身体的重要性”,总会有人说我装B,当遇到问题的时候再说就没有人反驳了,不要给自己太多的理由和借口,其实坟场是个不错的地方,可以让自己切身体会到“千里孤坟”的凄凉,就那么的躺在地里,长出草,当然,最好能开出花儿。 有很多的人问过我,两年军旅里学到了什么,我常会反问九年义务教育你学到了什么,时间比两年长得多,却也没有人能回答我,读书认字?那只是九年义务教育进行下去的条件。我也问过自己,也很纠结自己学到了什么,转念一想,这个叫做经历,是成长,是磨砺,是在艰难困苦里驱动自己前行的动力。 如果有人见过我将一条在我脚边张牙舞爪的蜈蚣一脚碾成一团灰黑色的蠕动的肉坨坨,可能就会重新认识这个长得不帅、个儿不高、经常胡子拉碴的小伙儿了,也许很久以前我是木讷的,随波逐流的。 但是,在很长一段时间前,就不了。 居然有些饿了,我得去为自己准备一些很有特色的黑暗料理,以慰藉这不安的灵魂。 妄尘集 2017-06-15 评论 1855 次浏览
sar命令 sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。本文主要以CentOS 6.3 x64系统为例,介绍sar命令。 sar命令常用格式 sar [options] [-A] [-o file] t [n] 其中: t为采样间隔,n为采样次数,默认值是1; -o file表示将命令结果以二进制格式存放在文件中,file 是文件名。 options 为命令行选项,sar命令常用选项如下: -A:所有报告的总和 -u:输出CPU使用情况的统计信息 -v:输出inode、文件和其他内核表的统计信息 -d:输出每一个块设备的活动信息 -r:输出内存和交换空间的统计信息 -b:显示I/O和传送速率的统计信息 -a:文件读写情况 -c:输出进程统计信息,每秒创建的进程数 -R:输出内存页面的统计信息 -y:终端设备活动情况 -w:输出系统交换活动信息 1. CPU资源监控 例如,每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令: sar -u -o test 10 3 屏幕显示如下: 17:06:16 CPU %user %nice %system %iowait %steal %idle 17:06:26 all 0.00 0.00 0.20 0.00 0.00 99.80 17:06:36 all 0.00 0.00 0.20 0.00 0.00 99.80 17:06:46 all 0.00 0.00 0.10 0.00 0.00 99.90 Average: all 0.00 0.00 0.17 0.00 0.00 99.83 输出项说明: CPU:all 表示统计信息为所有 CPU 的平均值。 %user:显示在用户级别(application)运行使用 CPU 总时间的百分比。 %nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。 %system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。 %iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。 %steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。 %idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。 1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈 2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量 3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。 如果要查看二进制文件test中的内容,需键入如下sar命令: sar -u -f test 2. inode、文件和其他内核表监控 例如,每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令: sar -v 10 3 屏幕显示如下: 17:10:49 dentunusd file-nr inode-nr pty-nr 17:10:59 6301 5664 12037 4 17:11:09 6301 5664 12037 4 17:11:19 6301 5664 12037 4 Average: 6301 5664 12037 4 输出项说明: dentunusd:目录高速缓存中未被使用的条目数量 file-nr:文件句柄(file handle)的使用数量 inode-nr:索引节点句柄(inode handle)的使用数量 pty-nr:使用的pty数量 3. 内存和交换空间监控 例如,每10秒采样一次,连续采样3次,监控内存分页: sar -r 10 3 屏幕显示如下: 输出项说明: kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间. kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间. %memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比. kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap). %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比. 4. 内存分页监控 例如,每10秒采样一次,连续采样3次,监控内存分页: sar -B 10 3 屏幕显示如下: 输出项说明: pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB) pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB) fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor) majflt/s:每秒钟产生的主缺页数. pgfree/s:每秒被放入空闲队列中的页个数 pgscank/s:每秒被kswapd扫描的页个数 pgscand/s:每秒直接被扫描的页个数 pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数 %vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比 5. I/O和传送速率监控 例如,每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令: sar -b 10 3 屏幕显示如下: 18:51:05 tps rtps wtps bread/s bwrtn/s 18:51:15 0.00 0.00 0.00 0.00 0.00 18:51:25 1.92 0.00 1.92 0.00 22.65 18:51:35 0.00 0.00 0.00 0.00 0.00 Average: 0.64 0.00 0.64 0.00 7.59 输出项说明: tps:每秒钟物理设备的 I/O 传输总量 rtps:每秒钟从物理设备读入的数据总量 wtps:每秒钟向物理设备写入的数据总量 bread/s:每秒钟从物理设备读入的数据量,单位为 块/s bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s 6. 进程队列长度和平均负载状态监控 例如,每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态: sar -q 10 3 屏幕显示如下: 19:25:50 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 19:26:00 0 259 0.00 0.00 0.00 19:26:10 0 259 0.00 0.00 0.00 19:26:20 0 259 0.00 0.00 0.00 Average: 0 259 0.00 0.00 0.00 输出项说明: runq-sz:运行队列的长度(等待运行的进程数) plist-sz:进程列表中进程(processes)和线程(threads)的数量 ldavg-1:最后1分钟的系统平均负载(System load average) ldavg-5:过去5分钟的系统平均负载 ldavg-15:过去15分钟的系统平均负载 7. 系统交换活动信息监控 例如,每10秒采样一次,连续采样3次,监控系统交换活动信息: sar - W 10 3 屏幕显示如下: 19:39:50 pswpin/s pswpout/s 19:40:00 0.00 0.00 19:40:10 0.00 0.00 19:40:20 0.00 0.00 Average: 0.00 0.00 输出项说明: pswpin/s:每秒系统换入的交换页面(swap page)数量 pswpout/s:每秒系统换出的交换页面(swap page)数量 8. 设备使用情况监控 例如,每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令: # sar -d 10 3 –p 屏幕显示如下: 17:45:54 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 17:46:04 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17:46:04 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17:46:04 vg_livedvd-lv_root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17:46:04 vg_livedvd-lv_swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 其中: 参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0 tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的. rd_sec/s:每秒读扇区的次数. wr_sec/s:每秒写扇区的次数. avgrq-sz:平均每次设备I/O操作的数据大小(扇区). avgqu-sz:磁盘请求队列的平均长度. await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒). svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间. %util:I/O请求占CPU的百分比,比率越大,说明越饱和. 1. avgqu-sz 的值较低时,设备的利用率较高。 2. 当%util的值接近 1% 时,表示设备带宽已经占满。 要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来 怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看 怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看 随手笔记 2017-05-30 评论 2597 次浏览