使用Shell自动化代替复杂低效率的工作

2012年11月1日 · 12 years ago

最近某项更新的工作需要做大量重复的工作,一方面在作打包工作时在图形界面上做文件十分繁琐,另一方面在编辑config文件时即使用上正则替换也常常需要作人工检查和C&P,非常浪费时间。于是乎写了个Shell脚本把该自动化的都自动化,以后作这种工作一个命令就解决。

脚本是在 Mac OS X 上写的,没用到什么特殊的命令,所以类Unix的操作系统应该都能跑。文末有今天编写的脚本。

Shell需要注意的地方有:

  • #是注释,但是第一句#!/bin/bash是指定shell的解释脚本。

#!后面带上解释脚本的绝对路径。

如果脚本第一句不以#!开头则默认使用 Bourne Shell, 即:/bin/sh

如果第一个非空字符是#但不是#!开头则默认使用 C Shell。

常用的解释脚本有:


#!/usr/bin/perl

#!/bin/php

#!/bin/expect
  • 参数

Shell脚本通常都可以用命令+参数的形式调用,如:

command -p1 - p2 

在脚本中 $# 代表参数个数,$0 代表程序的名字。所以跟平时习惯不同的是,第一个参数是 $1 而不是 $0。最多支持9个参数, $1 - $9.

  • 比较

Shell的比较常用

-lt #小于

-gt #大于

-eq #等于

如:

if [ "$a" -eq "$b" ];

也可以使用CShell风格的 < , > 但是需要加上双层括号,如:

if (("$a" < "$b")) then

还有一些其他的比较方式,不复杂的脚本有 -lt -gt 就足够了。

  • 变量
aVar=123 #变量赋值
echo $aVar #变量使用
  • 字符串操作

字符串操作在作文件命名的时候很有用,可以批量重命名之类的。

这篇文章有很详细的字符串操作的介绍:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html

  • 条件判断
#[]里面一定要有两个空格
if [ $# -lt 3 ];
then
else
fi
#以fi结束每一个if
  • 脚本
#!/bin/bash

#配置打包后会输出的路径

targetPath=~/Download/packages/

echo "****************************************"

echo "* Pack Language Packages. -- JustinYim *"

echo "****************************************"

echo "ouput path: ~/Download/packages/"

echo "Now Starting..."

&nbsp;

if [ $# -lt 2 ];

then

echo "Oops, please append the Resources folder's path."

echo "And the version name like: pack xxx/xxx 1.1.2"

else

echo "Resources path: "$1

echo "Clening target path..."

rm -rf ~/Downloads/packages/*

echo "CPing files..."

#CP Files

cp -rf $1/*.lproj ~/Downloads/packages/

cd ~/Downloads/packages

#中文简体不进行更新,直接删掉

rm -rf zh_cn.lproj

&nbsp;

#zip files

#新建一个配置文件

echo '[package]' > conf.conf

#设置包的起始值,因为之前已经有很多个包在服务器上了

num=7

#遍历所有文件

for filename in $(ls)

do

#不对配置文件进行压缩动作

if [ "$filename" = "conf.conf" ]

then

echo "Config file!"

continue

fi

&nbsp;

#echo "ZIPing "$filename"..."

#替换掉版本号里面的.字符,如1.1.2改为1_1_2作为文件名用

ver=${2//./_}

#去掉文件名后缀,%表示从字符串尾部开始,找到.字符的时候,去掉后面的字符,如:ar.lproj会变成ar

#如果是 ${filename#.*} 则会变成从头部开始, ar.lproj会变成 lproj

lang=${filename%.*}

#设置zip文件的名字

zipname=x.strings.$lang.$ver.zip

#复制并压缩x.strings文件

cp $filename/x.strings x.strings.$lang

zip $zipname x.strings.$lang

#echo 'wirting config file...'

#自动编写配置文件

echo '[number'$num']' >> conf.conf

echo 'Id='$((++num)) >> conf.conf

echo 'PackPath=/xxx/package/'$zipname >> conf.conf

echo 'Name='$lang'|'$2 >> conf.conf

echo '' >> conf.conf

#clean files

#删掉临时文件

echo "Remove temp files..."

rm -rf $filename

rm x.strings.$lang

done

fi