以Linux系统为例,linux系统里面有很多个命令,脚本可以是一个或者多个命令的集合,通过运行脚本,达到既定的功能或者效果。Shell脚本可以帮助我们系统、自动化的去管理和处理一些东西,举个例子,我们在做集成自动化测试的过程当中,经常都需要做的几步工作
此过程中可能会需要用到一系列的命令和一些手工操作,使用Shell脚本,我们可以让这一系列的过程自动执行。
shell script就像早期dos年代的.bat bat是windows平台下的批处理 shell一般是指linux下的shell
1、作为可执行程序:
2、作为解释器参数 这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如: /bin/sh test.sh /bin/php test.php 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
echo $SHELL 查看当前shell版本, 使用的shell不同, 对应的配置文件也不一样
vim ~/.bash_profile
//或者
vim ~/.bashrc
vim ~/.zshrc
PS.通过如下命令可切换shell
//切换到zsh
chsh -s `which zsh`
//切换到bash
chsh -s `which bash`
在文件顶部用如下代码 . filePath #注意点号(.)和文件名中间有一空格 或 source filePath
两个反引号包围起来的字符串,将作为命令来运行,执行的输出结果作为该反引号的内容,称为命令替换,它有另一种更好的写法: $(command)
注意,变量名和等号之间不能有空格
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
使用 unset 命令可以删除变量,不可以删除readonly变量。语法:
unset variable_name
在 Shell 中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
还可以单独定义数组的各个分量,可以不使用连续的下标,而且下标的范围没有限制。:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
${数组名[下标]}
使用 @ 或者 * 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
取得数组元素的个数
length=${#array_name[@]}
或者length=${#array_name[*]}
取得数组单个元素的长度
lengthn=${#array_name[n]}
在命令后面用空格分隔参数,脚本中用$n接收,$0表示脚本文件名。
./test.sh 1 2 3
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
给 alias 添加命令行参数 就是把要执行的命令定义在一个函数中 注意每一行代码后最好加上分号,不然可能失败。
// 安装带有日期和版本号的apk
alias xxxDebug='fakeMethod() { adb install -r /Users/bruce/work/sourcecode/Projects_Android/git/xxx/app/build/outputs/apk/pc/debug/com.xxx._pc_$(date "+%Y%m%d")_$1.apk; };fakeMethod'
// 命令输入
xxxDebug '1.6.0'
注意点:
表达式四种写法: val=`expr 2 + 2` val=$(expr 2 + 2) val=$((2 + 2)) var=$[2 + 2]
(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。 (2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。 (3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
字符串有专用的运算符 用来计算字符串是否相等、长度是否为0、字符串是否为空等
文件测试运算符用于检测 Unix 文件的各种属性。如文件是普通文件还是目录、是否可写、是否只读
echo输出的字符串总结 | | 能否引用变量 | 能否引用转移符 | 能否引用文本格式符(如:换行符、制表符) | | — | — | — | — | | 单引号 | 否 | 否 | 否 | | 双引号 | 能 | 能 | 能 | | 无引号 | 能 | 能 | 否 | 显示结果定向至文件 echo “It is a test” > myfile 原样输出字符串,不进行转义或取变量(用单引号) echo ‘$name"’ #输出$name" 显示命令执行结果 echo `date` #输出日期Thu Jul 24 10:08:46 CST 2014
略
略
cd $FLUTTER_ROOT/bin/cache/artifacts/engine
for arch in android-arm android-arm-profile android-arm-release; do
pushd $arch
cp flutter.jar flutter-armeabi-v7a.jar # 备份
unzip flutter.jar lib/armeabi-v7a/libflutter.so
mv lib/armeabi-v7a lib/armeabi
zip -d flutter.jar lib/armeabi-v7a/libflutter.so
zip flutter.jar lib/armeabi/libflutter.so
popd
done
// 将所有的.js结尾的文件,都加上.backup后缀
ls *.js | xargs -t -I '{}' mv {} {}.backup
// 将7天前的日志备份到特定目录
find . -mtime +7 | xargs -I '{}' mv {} /tmp/otc-svr-logs/