分享

shell数组、循环实战演练

 地势坤行者无疆 2018-01-12

  1. #!/bin/bash  
  2. array=(1 2 3 4 5) #以括号括起为数组 中间是空格  
  3. for num in "${array[@]}"  #以这种for打印数组  
  4. do  
  5.     echo $num  
  6. done  
  7.   
  8. xxx[0]='a' #第二种定义数组的方法  
  9. xxx[1]='b'  
  10. xxx[2]='c'  
  11. for ((i=0; i<${#xxx[@]};i++)); do # ${#xxx[@]} 返回数组的大小  
  12.     echo ${xxx[i]}  #${xxx[$i]} ${xxx[${i}]} 这两种都可以 通过下标打印数组 数组从0开始  
  13. done  
  14.   
  15. #对目录处理的一些技巧  
  16. xxx=(`ls`) # ``这里可以包含一些shell命令(~这个键) 这个配合管道命令是很强大的 grep sed  
  17. for file in "${xxx[@]}" #用第二种for循环也是可以的  
  18. do  
  19.     echo $file   
  20. done   
  21.   
  22. #sh相加字符串是非常方便的 直接放到后面就可以了   
  23. #单引号和双引号是有区别的 单引号只能放字符串 双引号里面可以解释变量  
  24. initPath='/a'  
  25. secPath='/b'  
  26. thrPath='c'  
  27. path=${initPath}'/'  
  28. path=${initPath}${secPath}'/'${thrPath}  
  29.   
  30. #对数字的支持可能就比较烦了  
  31. xxx=2  
  32. xx=${xxx}-1  
  33. echo $xx  #输出:2-1  
  34. echo $(($xxx-1)) #如果是数字运算 外面加上 $(( )) 才会得到正确的结果  
  35. let "x=xxx+(xx*2)" #let 相当于(()) 这个比较好用  
  36. echo $x  
  37. x=$((xxx+(xx*2))) #2种方式相同 如果是数字处理可以不带$  字符串必须要带$ 或 ${}  
  38. echo $x  
  39.   
  40. #declare 可以定义变量的属性  
  41. declare -i i=1 #定义一个int的变量  
  42. declare -i sum=0  
  43. while ((i<10)); do #while循环  
  44.     let sum+=i  
  45.     let ++i  
  46. done  
  47. echo $sum  
  48.   
  49. while read line; do  
  50.     echo $line  
  51.     break    #shell是支持 break 和 countinue的  
  52. done  
  53.   
  54. #if 语句 判断数字的写法 [ ] 两边都要有空格 -ne 不相等的意思   
  55. 这里比较的是数字 所以 $(($filesNum-1))这个就要这样写 $((${filesNum}-1)) 都可以  
  56. if [ "$j" -ne "$(($i-1))" ]||[ "$j" -ne "$(($filesNum-1))" ]; then  
  57.   
  58. else  
  59.   
  60. fi  
  61. #比较字符串 是否相等  
  62. if [ "${initPath}" != "${buildPath}" ]; then  
  63.   
  64. elif [ command ]; then  
  65.   
  66. fi  
  67. #判断目录是否存在  
  68. if [ ! -d "${buildPath}" ]; then  
  69.         mkdir $buildPath  
  70. fi  




实战演练,一下代码的实现目标,把一个文件夹内,数字命名的zip文件,按数字大小排序,生成中间的zip

例如:有1.zip 2.zip 3.zip 生成1-2-3.zip 2-3.zip 生成这种中间的zip  1-2-3.zip 是 2覆盖1 3覆盖这两个   组成一个包含1 2 3所有文件的zip  zip文件解压出来是不带父目录的

  1. #!/bin/bash  
  2. initPath=`pwd`  
  3. buildPath=`pwd` #'/Users/yuanxiaodong/Desktop/test'  
  4. #initPath=$1 #路径传参数  
  5. #buildPath=$2  
  6.   
  7. cd $buildPath  
  8. #删除生成的 - *.zip压缩包  
  9. `ls *.zip | grep '[+]' | xargs rm`  
  10. # for file in `ls *.zip | grep '[-]'`   
  11. # do   
  12. #   rm $file  
  13. # done   
  14.   
  15. cd $initPath  
  16. for zipFile in `ls *.zip`; do #不解压 __MACOSX 文件  
  17.     mkdir ${zipFile%.*}  
  18.     unzip $zipFile -x __MACOSX/* -d ${zipFile%.*}'/'  
  19. done  
  20.   
  21. #查找解压完的文件夹 并放到数组中 ()  
  22. files=(`ls -F|grep "/" | sed 's/.$//'`)  
  23. #取数组的长度  
  24. filesNum=${#files[@]}  
  25.   
  26. #文件排序 从小到大  
  27. for ((i=0;i<${#files[@]};i++)); do  
  28.     for ((j=i; j<${filesNum}-1; j++)); do  
  29.         if [ "${files[$((${j}))]}" -gt "${files[${j}+1]}" ]; then  
  30.             temp=${files[$((${j}+1))]}  
  31.             files[$((${j}+1))]=${files[${j}]}  
  32.             files[${j}]=${temp}  
  33.         fi  
  34.     done  
  35. done  
  36.   
  37. #生成zip的名字  
  38. for ((i=1;i<${#files[@]};i++)); do  
  39.     newFileName='+'${files[i-1]}  
  40.     # for ((j=i;j<${#files[@]};j++)); do  
  41.     #   if [ "$j" -ne "$(($i-1))" ]||[ "$j" -ne "$(($filesNum-1))" ]; then #  
  42.     #       newFileName=${newFileName}'-'${files[j]}  
  43.     #   else  
  44.     #       newFileName=${newFileName}${files[j]}  
  45.     #   fi  
  46.     # done  
  47.     mkdir $newFileName #创建文件夹   
  48.   
  49.     #拷贝相应文件到目录  
  50.     for ((k=i-1;k<${#files[@]};k++)); do  
  51.         cd ${files[k]}  #linux cp -r ${files[k]}'/' ${newFileName} 这种不能拷贝子文件夹 必须要进目录  
  52.         cp -rf * '../'${newFileName}  
  53.         cd ..  
  54.     done  
  55.   
  56.     cd $newFileName  
  57.     zip ../$newFileName'.zip' -r ./* #压缩文件  
  58.       
  59.     cd ..  
  60.     rm -rf $newFileName #删除生成的文件夹 -r是递归删除 -f是强制删除 <span style="color: rgb(51, 51, 51); font-family: 宋体; font-size: 14px; line-height: 25px;">force</span>  
  61. done  
  62.   
  63. #删除解压出来的文件  
  64. for ((i=0;i<${filesNum};i++)); do  
  65.     rm -rf ${files[i]}  
  66. done  
  67.   
  68. #如果目录不相同 把生成的zip拷贝到该目录  
  69. if [ "${initPath}" != "${buildPath}" ]; then  
  70.     #目录不存在 创建目录  
  71.     if [ ! -d "${buildPath}" ]; then  
  72.         mkdir $buildPath  
  73.     fi  
  74.   
  75.     for file in `ls *.zip | grep '[-]'`; do   
  76.         echo $file  
  77.         cp -rf $file ${buildPath}  
  78.         rm -rf $file  
  79.     done   
  80. fi  




shell是非常方便的,基本语言所有的功能都有,遇到不熟悉的地方,多上网查查,不要总怀疑,而不去实践和查询。

参考文章:

很好的shell if的讲解文章 http://blog.sina.com.cn/s/blog_4c197d420101bthf.html

shell数组的讲解 http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html

shell截取字符串总结 http://www.cnblogs.com/xwdreamer/p/3823463.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多