自用压缩解压缩工具测试加强版 ``` #!/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 评论 2369 次浏览
自用压缩解压缩工具测试版 ``` #!/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 评论 2431 次浏览
自用一键LAMP源码环境(CentOS6.8) ``` echo "LAMP starting...." #先检查光盘是否挂载 VALUE1=$(df -h |grep "/dev/sr0" >/dev/null) VALUE2=$(df -h |grep "/dev/sr1" >/dev/null) if [ -z "$VALUE1" ]; then if [ -b /dev/sr0 ]; then mkdir -p /ISO/cdrom1 mount -t iso9660 /dev/sr0 /ISO/cdrom1 else echo "/dev/sr0 is not exiest!" exit 1 fi fi if [ -z "$VALUE2" ]; then if [ -b /dev/sr1 ]; then mkdir -p /ISO/cdrom2 mount -t iso9660 /dev/sr1 /ISO/cdrom2 else echo "/dev/sr1 is not exiets!" exit 1 fi fi if [ -f /etc/yum.repos.d/CentOS-Base.repo ]; then mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak fi yum clean all yum list if [ "$?" == "0" ]; then echo "yum is ok" else #判断光盘大小,用于指定顺序 CD1=$(df -P |grep "/dev/sr0" |awk -F ' ' '{print $3}') CD2=$(df -P |grep "/dev/sr1" |awk -F ' ' '{print $3}') if [ $CD1 -gt $CD2 ]; then CDROM1="/ISO/cdrom1" CDROM2="/ISO/cdrom2" else CDROM1="/ISO/cdrom2" CDROM2="/ISO/cdrom1" fi echo ' [c6-media] name=CentOS-software-package baseurl=file://$CDROM1 file://$CDROM2 gpgchk=0 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6' >/etc/yum.repos.d/CentOS-Media.repo fi sed -i '7s/enforcing/disabled/g' /etc/selinux/config if [ "$?" == "0" ]; then echo "selinux is close,next reboot come into force!this is Temporary effective." setnforce 0 fi iptables -F #iptables -A INPUT -p tcp -dport 80 -j ACCEPT service iptables stop chkconfig iptables off if [ -d /lamp ]; then cd /lamp else echo "/lamp is not exist!" exit 1 fi for i in $(ls); do [[ "$i" =~ ".tar" ]] && tar -xvf $i [[ "$i" =~ ".zip" ]] && unzip $i done DF1=$(df -Ph |grep "/usr" |awk -F ' ' '{print $4}' |cut -d "G" -f 1) DF2=$(df -Ph |grep "\/$" |awk -F ' ' '{print $4}' |cut -d "G" -f 1) if [ -n "$DF1" ]; then DF3=$(echo "$DF1" |sed "s/[0-9]//g") if [ -z "$DF3" ]; then if [ $DF1 -ge 3 ]; then echo -e "\033[32mcheck disk is ok! \033[0m" else echo -e "\033[31mdisk is full\033[0m" fi fi else echo "Tips:/usr is not alone mount." fi if [ -n "$DF2" ]; then DF4=$(echo "$DF2" |sed 's/[0-9]//g') if [ -z "$DF4" ]; then if [ $DF2 -ge 3 ]; then echo -e "\033[32mcheck disk is ok! \033[0m" else echo -e "\033[31mdisk is full\033[0m"; exit 1 fi fi else echo 'Tips:/ is not alone mount.' fi yum -y install gcc gcc-c++ #[ "$?" == "0" ] && "\033[32;2mgcc is OK!\033[0m" || echo -e "\033[31:2mgcc install fail!" yum -y install libxml2-devel yum -y install python-devel cd /lamp/libxml2-2.9.1 ./configure --prefix=/usr/local/libxml2/ if [ "$?" == "0" ];then make else echo "libxml2 not make" exit 11 fi if [ "$?" == "0" ]; then make install else echo "libxml2 not make install" exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2mlibxml2-2.9.1 is not install!\033[0m" && exit 11 cd /lamp/libmcrypt-2.5.8 ./configure --prefix=/usr/local/libmcrypt/ if [ "$?" == "0" ]; then make else echo "libmcrypt is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "libmcrypt is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2mlibmcrypt-2.5.8 is not install!\033[0m" && exit 11 cd /lamp/libmcrypt-2.5.8/libltdl ./configure --enable-ltdl-install if [ "$?" == "0" ]; then make else echo "libltdl is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "libltdl is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2mlibmcrypt-2.5.8/libltdl is not install!\033[0m" && exit 11 cd /lamp/mhash-0.9.9.9 ./configure if [ "$?" == "0" ]; then make else echo "mhssh-0.9.9.9 not make" exit 11 fi if [ "$?" == "0" ]; then make install else echo "mhash-0.9.9.9 not make install" exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2mmhash-0.9.9.9 is not install!\033[0m" && exit 11 ############################################################################################################ cd /lamp/mcrypt-2.6.8 #此处变量报错,改为掉后恢复正常。 LD_LIBRARY_PATH=/usr/local/libmcrypt/lib:/usr/local/lib ./configure --with-libmcrypt-prefix=/usr/local/libmcrypt if [ "$?" == "0" ]; then make else echo "mcrypt not make" exit 11 fi if [ "$?" == "0" ]; then make install else echo "mcrypt not make install" exit 11 fi ################################################################################################################ [ "$?" != "0" ] && echo -e "\033[31;2mmcrypt-2.6.8 is not install!\033[0m" && exit 11 cd /lamp/zlib-1.2.3 ./configure if [ "$?" == "0" ]; then sed -i '21s/CFLAGS=-O3 -DUSE_MMAP/CFLAGS=-O3 -DUSE_MMAP -fPIC/g' ./Makefile; make else echo "zlib is not make" exit 11 fi if [ "$?" == "0" ]; then make install else echo "zlib is not make install" exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m zlib-1.2.3 is not install!\033[0m" && exit 11 cd /lamp/libpng-1.2.31 ./configure --prefix=/usr/local/libpng if [ "$?" == "0" ]; then make else echo "libpng is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "libpng is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m libpng-1.2.31 is not install!\033[0m" && exit 11 mkdir -p /usr/local/jpeg6/{bin,lib,include,/man/man1} yum -y install libtool* cd /lamp/jpeg-6b \cp -f /usr/share/libtool/config/config.sub ./ \cp -f /usr/share/libtool/config/config.guess ./ cd /lamp/jpeg-6b ./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static if [ "$?" == "0" ]; then make else echo "jpeg is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "jpeg is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m jpeg-6b is not install!\033[0m" && exit 11 cd /lamp/freetype-2.3.5 ./configure --prefix=/usr/local/freetype/ if [ "$?" == "0" ]; then make else echo "freetype is not make" exit 11 fi if [ "$?" == "0" ]; then make install else echo "freetype is make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m freetype-2.3.5 is not install!\033[0m" && exit 11 \cp -rf /lamp/apr-1.4.6 /lamp/httpd-2.4.7/srclib/apr \cp -rf /lamp/apr-util-1.4.1 /lamp/httpd-2.4.7/srclib/apr-util cd /lamp/pcre-8.34 ./configure if [ "$?" == "0" ]; then make else echo "pcre-8.34 is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "pcre-8.34 is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m pcre-8.34 is not install!\033[0m" && exit 11 yum -y install openssl-devel cd /lamp/httpd-2.4.7 ./configure --prefix=/usr/local/apache2 --sysconfdir=/usr/local/apache2/etc --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared if [ "$?" == "0" ]; then make else echo "httpd-2.4.7 is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "httpd-2.4.7 is not make install." exit 11 fi #/usr/local/apache2/bin/apachectl start #[ "$?" == "0" ] && echo "test apache start is ok!" || echo "apache start is fail.check selinux."; exit 1 #ps aux |greep --color "httpd" #sleep 1 #netstat -tlun |grep --color ":80" #sleep 1 echo ' #!/bin/bash #Version:0.0.0 #Author:stone #Discription:apache start scripts # chkconfig: 2345 66 33 # discription:apache start httpd="/usr/local/apache2/bin/apachectl" case $1 in start) $httpd start ;; stop) $httpd stop ;; status) $httpd status ;; restart) $httpd stop sleep 1 $httpd start ;; --help) echo "use start|stop|restart|status" ;; *) echo "use start|stop|restart|status" ;; esac' >/etc/init.d/httpd chmod +x /etc/init.d/httpd chkconfig --add httpd chkconfig httpd on service httpd start yum -y install ncurses-devel cd /lamp/ncurses-5.9 ./configure --with-shared --without-debug --without-ada --enable-overwrite if [ "$?" == "0" ]; then make else echo "ncurses-5.9 is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "ncurses-5.9 is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m ncurses-5.9 is not install!\033[0m" && exit 11 yum -y install cmake yum -y install bison useradd -r -s /sbin/nologin mysql cd /lamp/mysql-5.5.48 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 if [ "$?" == "0" ]; then make else echo "mysql is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "mysql is not make install;" exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m mysql-5.5.48 is not install!\033[0m" && exit 11 cd /usr/local/mysql/ chown -R root . chown -R mysql data \cp -rf support-files/my-medium.cnf /etc/my.cnf cd /usr/local/mysql /usr/local/mysql/scripts/mysql_install_db --user=mysql & service mysqld start /usr/local/mysql/bin/mysqld_safe --user=mysql & \cp -a /lamp/mysql-5.5.48/support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld #给脚本执行权限 chkconfig --add mysqld chkconfig mysqld on service mysqld restart #数据库必须启动起来才可以设置密码 /usr/local/mysql/bin/mysqladmin -uroot password 123456 service mysqld stop #echo ' #show database; #use test; #show tables; #\s #exit #' | /usr/local/mysql/bin/mysql -u root -p123 yum -y install libtool* cd /lamp/php-7.0.7 ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc/ --with-apxs2=/usr/local/apache2/bin/apxs --with-libxml-dir=/usr/local/libxml2/ --with-jpeg-dir=/usr/local/jpeg6/ --with-png-dir=/usr/local/libpng/ --with-freetype-dir=/usr/local/freetype/ --with-mcrypt=/usr/local/libmcrypt/ --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=/usr/local/mysql --with-gd --without-pear if [ "$?" == "0" ]; then make else echo "php is not make" exit 11 fi if [ "$?" == "0" ]; then make install else echo "php is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m php-7.0.7 is not install!\033[0m" && exit 11 sed -i '/AddType.*tgz/i\AddType application/x-httpd-php .php .phtml' /usr/local/apache2/etc/httpd.conf sed -i '/AddType.*tgz/i\AddType application/x-httpd-php-source .phps' /usr/local/apache2/etc/httpd.conf yum -y install openssl-devel cd /lamp/php-7.0.7/ext/openssl mv config0.m4 config.m4 /usr/local/php/bin/phpize ./configure --with-openssl --with-php-config=/usr/local/php/bin/php-config if [ "$?" == "0" ]; then make else echo "php/ext/openssl is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "php/ext/openssl is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m php-7.0.7/ext/openssl is not install!\033[0m" && exit 11 cd /lamp/pecl-memcache-php7 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config if [ "$?" == "0" ]; then make else echo "pecl-memcache is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "pecl-memcache is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m pecl-memcache-php7 is not install!\033[0m" && exit 11 sed -i 's@extension_dir.*@extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20151012@g"' /usr/local/php/etc/php.ini sed -i 's@; extension="openssl.so";@extension="openssl.so";@g' /usr/local/php/etc/php.ini sed -i 's@; extension="memcache.so";@extension="memcache.so";@g' /usr/local/php/etc/php.ini yum -y install libevent-devel cd /lamp/memcached-1.4.17 ./configure --prefix=/usr/local/memcache if [ "$?" == "0" ]; then make else echo "memcache is not make." exit 11 fi if [ "$?" == "0" ]; then make install else echo "memcache is not make install." exit 11 fi [ "$?" != "0" ] && echo -e "\033[31;2m memcached-1.4.17 is not install!\033[0m" && exit 11 useradd -r -s /sbin/nologin memcache /usr/local/memcache/bin/memcached -umemcache & ln -s /usr/local/memcache/bin/memcached /usr/local/memcached \cp /lamp/memcached-1.4.17/scripts/memcached.sysv /etc/init.d/memcached sed -i 's@daemon memcached@daemon /usr/local/memcache/bin/memcached@' /etc/init.d/memcached sed -i 's@killproc memcached@killproc /usr/local/memcache/bin/memcached@' /etc/init.d/memcached #phpmyadmin 的版本会影响登录时的显示,此版本会在登录时弹出对话框。 \cp -fr /lamp/phpMyAdmin-4.1.4-all-languages /usr/local/apache2/htdocs/phpmyadmin cd /usr/local/apache2/htdocs/phpmyadmin \cp -fr config.sample.inc.php config.inc.php sed -i '29s/cookie/http/' /usr/local/apache2/htdocs/phpmyadmin/config.inc.php #添加用户,并修改apache主配置文件内容 groupadd www useradd -r -g www -s /sbin/nologin www sed -i '160s@User.*@User www@g' /usr/local/apache2/etc/httpd.conf sed -i '161s@Group.*@Group www@g' /usr/local/apache2/etc/httpd.conf sed -i '249s@$@& index.php@' /usr/local/apache2/etc/httpd.conf service httpd restart #重启服务 echo -e "\033[32;2mLAMP is OK!\033[0m" ``` shell脚本 2017-03-21 评论 2379 次浏览
nginx自启动脚本 ``` #!/bin/bash #chkconfig: 2345 99 33 #description: nginx server control tools ngxc="/usr/local/nginx/sbin/nginx" pidf="usr/local/nginx/logs/nginx.pid" ngxc_fpm="/usr/local/php/sbin/php-fpm" pidf_fpm="/usr/local/php/var/run/php-fpm.pid" case "$1" in start) $ngxc -t &> /dev/null if [ $? -eq 0 ];then $ngxc $ngxc_fpm echo "nginx service start success!" else $ngxc -t fi ;; stop) kill -s QUIT $(cat $pidf) kill -s QUIT $(cat $pidf_fpm) echo "nginx service stop success!" ;; restart) $0 stop $0 start ;; reload) $ngxc -t &> /dev/null if [ $? -eq 0 ];then kill -s HUP $(cat $pidf) kill -s HUP $(cat $pidf_fpm) echo "reload nginx config success!" else $ngxc -t fi ;; *) echo "please input stop|start|restart|reload." exit 1 esac ``` shell脚本 2017-03-20 评论 2424 次浏览
按要求生成随机数 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Description:create random alpha & number. while :; do echo -n -e "\033[31;1mplease input row:\033[0m" read ROW row1=$(echo "$ROW" |sed 's/[0-9]//g') #将用户的输入进行过滤 if [ -z $ROW ]; then echo "the input cannot be empty." continue #输入不能为空 elif [ "$row1" == "" ]; then break #满足输入条件退出循环 else continue #不满足条件继续循环 fi done while :; do echo -n -e "\033[31;1mplease input column:\033[0m" read COLUMN column1=$(echo "$COLUMN" |sed 's/[0-9]//g') #将用户的输入进行过滤 if [ -z $COLUMN ]; then echo "the input cannot be empty." continue #输入不能为空 elif [ "$column1" == "" ]; then break #满足输入条件退出循环 else continue #不满足条件继续循环 fi done while :; do echo -n -e "\033[31;1mplease input descriptor:\033[0m" read DS ds1=$(echo "$DS" |sed -r 's/([0-9]|[a-z]|[[:space:]])//g') #将用户的输入进行过滤 ds2=$(echo "$DS" |sed 's/[[:space:]]//g') if [ -z $ds2 ]; then echo "the input cannot be empty." continue #输入不能为空 elif [ "$ds1" == "" ]; then break #满足输入条件退出循环 else continue #不满足条件继续循环 fi done num1=0 #用于数组下标 for i in {a..z}; do #将a-z放入数组 alphabet[${num1}]=$i let num1++ done num2=0 #用于数组下标 for j in {0..9}; do #将0-9放入数组 number[${num2}]=$j let num2++ done discription=($DS) #将每一列的描述符放入数组 for i in `seq 10`; do for R in $(seq $ROW); do # for C in $(seq $COLUMN); do #取消循环,在遍历数组时已达到要求 for D in ${discription[*]}; do CL=$(echo $D |wc -L) for CHAR in $(seq $CL); do CH=$(echo "$D" |cut -c ${CHAR}) alpha=$(($RANDOM%26)) #获取字母数组的随机下标 num=$(($RANDOM%10)) #获取数字数组的随机下标 alpha1=alphabet[$alpha] num3=number[$num] eval array1=$(echo \${$alpha1}) eval array2=$(echo \${$num3}) echo "$CH" |grep "[[:digit:]]" > /dev/null if [ "$?" == "0" ]; then LINE="${LINE}${array2}" fi echo "$CH" |grep "[[:alpha:]]" > /dev/null if [ "$?" == "0" ]; then LINE="${LINE}${array1}" fi done LINE="${LINE} " done echo $LINE >> /tmp/${i}.txt unset LINE # done done done ``` shell脚本 2017-03-19 评论 2422 次浏览
允许远程登录的白名单 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:allow white list. #从键盘获取白名单 while :; do echo -e "\e[33m请输入允许的主机地址或网段,以空格或字母隔开:\e[0m" read IPADDR1 #使用正则去匹配用户的输入 JUDGE=$(echo $IPADDR1 |sed -r "s/([[:space:]]|[[:alpha:]])?([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])([[:space:]]|[[:alpha:]])?//g") if [ -z "$JUDGE" ]; then num1=$(echo $IPADDR1 |awk -F '[[:space:]]|[[:alpha:]]' "{printf NF}") for ((i=1;i<=$num1;i++)); do echo $IPADDR1 |awk -F '[[:space:]]|[[:alpha:]]' "{print \$$i}" >> /tmp/whitelist.txt done include /sh/whitelist.sh else echo -e "\e[31;1m你的输入有误,请重新输入!\e[0m" continue fi done ``` shell脚本 2017-03-18 评论 2378 次浏览