Shell 作为一门最常见的脚本语言,是测试工程师日常工作的重度依赖工具。相对 Python、Ruby 等其他脚本语言,Shell 就像一把趁手的军用匕首,轻量敏捷,是深入分析待测系统的利器,也是自动化能力的重要基础。呃...,也是测试工程师提高工作效率,节约时间,能提前下班约妹子逛街,陪老婆看娃的必要手段。 1. Shell 运行环境概念 * bash下还可以再重新启动一个shell,这个shell是sub shell(子shell),原shell会复 制自身给他。在sub shell中定义的变量,会随着sub shell的消亡而消失 * () 子shell中运行 * $(ls) 表示执行ls后的结果,与``作用一致,不过可以嵌套 * {} 当前shell中执行 * $$ 当前脚本执行的pid * & 后台执行 * $!运行在后台的最后一个作业的PID(进程ID) 实践展示: 如下操作步骤,查看当前bash的pid->开启另一个bash->查看pid->退出当前bash->再查看pid;我们会发现两个bash的pid不同,说明这是两个不同的运行环境 $ echo $$ #查看当前bash的pid 15493 $ bash #开启另一个bash $ echo $$ #查看pid 15514 $ exit #退出当前bash exit $ echo $$ #再查看pid 15493 子 shell 与当前 shell $ a="当前shell" $ (a=1;echo $a;);echo $a #(表示在sub shell中运行) 1 当前shell $ { a=1;echo $a; };echo $a #{表示在当前shell中运行} 1 1 后台执行并调用 $ sleep 100& [2] 15851 $ jobs [1]+ 已停止 sleep 50 [2]- 运行中 sleep 100 & $ fg 2 sleep 100 ^Z [2]+ 已停止 sleep 100 $ bg 2 [2]+ sleep 100 & $ jobs [1]+ 已停止 sleep 50 [2]- 运行中 sleep 100 & $ 1. shell环境变量 shell首先是一个工作环境,有很多变量可以供我们使用。例如:set可以获得当前的所有变量。 env可以获得可以传递给子进程的变量,export aa=bbbb 把私有变量导出 $ vi ~/.bash_profile ANDROID_HOME=/Users/qinzhen/Library/Android/sdk export PATH=$ANDROID_HOME/tools:$PATH export PATH=$ANDROID_HOME/platform-tools:$PATH export PATH=$ANDROID_HOME/tools/bin:$PATH export JMETER_HOME=/Users/qinzhen/Documents/TestDev/apache-jmeter-5.1.1 export PATH=$JMETER_HOME/bin:$PATH export M3_HOME=/Users/qinzhen/Documents/TestDev/maven/apache-maven-3.6.1 export PATH=$M3_HOME/bin:$PATH 2、shell输入输出 * Read 用来读取输入,并赋值给变量 * echo ,printf可以简单输出变量。 * > file 将输出重定向到另一个文件 * >> 表示追加 等价于tee -a * < file 输入重定向 * | 表示管道,也就是前一个命令的输出传入下一个命令的输入 3. 文件描述符 输入文件—标准输入0 输出文件—标准输出1 错误输出文件—标准错误2 使用 2>&1 >/tmp/tmp < /tmp/tmp 2. 条件 、分支 、循环用法 由于平常测试工作中用到的几乎就是 if、for、while,所以这里也就只重点介绍这3种用法 * 条件 if * 分支 case * 循环 for while until select break 和 continue 1. if结构 * if [ condition ] ; then ...;fi * if [ condition ] ; then ...;else ...;fi * if [ condition ] ; then ...;elif ...;fi * 简单的逻辑可以使用 && || 去替代 * 条件可以用命令返回值代替 部分展示 $ [ -e Allen_qin ]&&echo exist || echo not exist exist $ [ -e Allen ]&&echo exist || echo not exist not exist 2. for 循环 for(( c1 ; c2 ; c3 )); do...; done for x in ${arr[*]}; do echo $x; done 实践展示: $ for ((i=0;i<10;i++));do echo $i;done 0 1 2 3 4 5 6 7 8 9 $ arr=(1 2 3 4) $ for((i=0;i<${#arr[*]};i++));do echo ${arr[$i]};done 1 2 3 4 $ for x in ${arr[*]};do echo $x;done 1 2 3 4 $ for x in `ls`;do echo $x;done 1 1.sh 3 Allen_qin nginx.log test $ ss="1 2 3" $ for x in $ss;do echo $x;done 1 2 3 3. while循环 * i=0;while [ $i -lt 3 ] ;do echo $i;((i=i+1));done * 一个有用的小技巧。一行行的读取文件内容 : while read line;do echo $line;done < /tmp/tmp 实践展示 $ i=0;while [ $i -le 3 ];do echo $i;((i++));done 0 1 2 3 $ cat while_test a b c d e $ while read line;do echo $line;done < while_test a b c d e 4. 退出控制 * return 函数返回 * exit 脚本进程退出 * break 退出当前循环 * continue 跳过当前的循环,进入下一次循环 |