shell数组、循环实战演练
2015-09-04 00:27
429 查看
#!/bin/bash array=(1 2 3 4 5) #以括号括起为数组 中间是空格 for num in "${array[@]}" #以这种for打印数组 do echo $num done xxx[0]='a' #第二种定义数组的方法 xxx[1]='b' xxx[2]='c' for ((i=0; i<${#xxx[@]};i++)); do # ${#xxx[@]} 返回数组的大小 echo ${xxx[i]} #${xxx[$i]} ${xxx[${i}]} 这两种都可以 通过下标打印数组 数组从0开始 done #对目录处理的一些技巧 xxx=(`ls`) # ``这里可以包含一些shell命令(~这个键) 这个配合管道命令是很强大的 grep sed for file in "${xxx[@]}" #用第二种for循环也是可以的 do echo $file done #sh相加字符串是非常方便的 直接放到后面就可以了 #单引号和双引号是有区别的 单引号只能放字符串 双引号里面可以解释变量 initPath='/a' secPath='/b' thrPath='c' path=${initPath}'/' path=${initPath}${secPath}'/'${thrPath} #对数字的支持可能就比较烦了 xxx=2 xx=${xxx}-1 echo $xx #输出:2-1 echo $(($xxx-1)) #如果是数字运算 外面加上 $(( )) 才会得到正确的结果 let "x=xxx+(xx*2)" #let 相当于(()) 这个比较好用 echo $x x=$((xxx+(xx*2))) #2种方式相同 如果是数字处理可以不带$ 字符串必须要带$ 或 ${} echo $x #declare 可以定义变量的属性 declare -i i=1 #定义一个int的变量 declare -i sum=0 while ((i<10)); do #while循环 let sum+=i let ++i done echo $sum while read line; do echo $line break #shell是支持 break 和 countinue的 done #if 语句 判断数字的写法 [ ] 两边都要有空格 -ne 不相等的意思 这里比较的是数字 所以 $(($filesNum-1))这个就要这样写 $((${filesNum}-1)) 都可以 if [ "$j" -ne "$(($i-1))" ]||[ "$j" -ne "$(($filesNum-1))" ]; then else fi #比较字符串 是否相等 if [ "${initPath}" != "${buildPath}" ]; then elif [ command ]; then fi #判断目录是否存在 if [ ! -d "${buildPath}" ]; then mkdir $buildPath 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文件解压出来是不带父目录的
#!/bin/bash
initPath=`pwd`
buildPath=`pwd` #'/Users/yuanxiaodong/Desktop/test'
#initPath=$1 #路径传参数
#buildPath=$2
cd $buildPath
#删除生成的 - *.zip压缩包
`ls *.zip | grep '[+]' | xargs rm`
# for file in `ls *.zip | grep '[-]'`
# do
# rm $file
# done
cd $initPath
for zipFile in `ls *.zip`; do #不解压 __MACOSX 文件
mkdir ${zipFile%.*}
unzip $zipFile -x __MACOSX/* -d ${zipFile%.*}'/'
done
#查找解压完的文件夹 并放到数组中 ()
files=(`ls -F|grep "/" | sed 's/.$//'`)
#取数组的长度
filesNum=${#files[@]}
#文件排序 从小到大
for ((i=0;i<${#files[@]};i++)); do
for ((j=i; j<${filesNum}-1; j++)); do
if [ "${files[$((${j}))]}" -gt "${files[${j}+1]}" ]; then
temp=${files[$((${j}+1))]}
files[$((${j}+1))]=${files[${j}]}
files[${j}]=${temp}
fi
done
done
#生成zip的名字
for ((i=1;i<${#files[@]};i++)); do
newFileName='+'${files[i-1]}
# for ((j=i;j<${#files[@]};j++)); do
# if [ "$j" -ne "$(($i-1))" ]||[ "$j" -ne "$(($filesNum-1))" ]; then #
# newFileName=${newFileName}'-'${files[j]}
# else
# newFileName=${newFileName}${files[j]}
# fi
# done
mkdir $newFileName #创建文件夹
#拷贝相应文件到目录
for ((k=i-1;k<${#files[@]};k++)); do
cd ${files[k]} #linux cp -r ${files[k]}'/' ${newFileName} 这种不能拷贝子文件夹 必须要进目录
cp -rf * '../'${newFileName}
cd ..
done
cd $newFileName
zip ../$newFileName'.zip' -r ./* #压缩文件
cd ..
rm -rf $newFileName #删除生成的文件夹 -r是递归删除 -f是强制删除 <span style="color: rgb(51, 51, 51); font-family: 宋体; font-size: 14px; line-height: 25px;">force</span>
done
#删除解压出来的文件
for ((i=0;i<${filesNum};i++)); do
rm -rf ${files[i]}
done
#如果目录不相同 把生成的zip拷贝到该目录
if [ "${initPath}" != "${buildPath}" ]; then
#目录不存在 创建目录
if [ ! -d "${buildPath}" ]; then
mkdir $buildPath
fi
for file in `ls *.zip | grep '[-]'`; do
echo $file
cp -rf $file ${buildPath}
rm -rf $file
done
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
相关文章推荐
- android wifi 无线调试
- 运维入门
- 动态清空 nohup 输出文件
- install scrapy with pip and easy_install
- Linux Shell常用技巧
- Linux Shell - 如何使用sort与uniq命令删除重复的文本行
- shell字符串操作详解
- Shell中删除某些文件外所有文件的3个方法
- Ruby中执行Linux shell命令的六种方法详解
- VB使用shell函数打开外部exe程序的实现方法
- Shell编程的一些知识集合
- Shell中的for和while循环详细总结
- 什么是Shell?Shell脚本基础知识详细介绍
- Shell脚本中引用、调用另一个脚本文件的2种方法
- Shell脚本解压rpm软件包
- Shell脚本实现复制文件到多台服务器的代码分享
- Shell脚本实现批量替换文件内容
- Shell脚本实现的一个简易Web服务器例子分享
- linux Shell学习笔记第五天
- Perl 获取shell命令的执行结果