#!/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