测试工作常用Linux/Shell命令之Bash逻辑控制
  p1prOQge3cDY 2023年11月02日 51 0

测试工作常用Linux/Shell命令之Bash逻辑控制_bash

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 跳过当前的循环,进入下一次循环
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  rEZj93RghFYQ   2023年11月02日   18   0   0 i++leetcode-java
  JiJ96DoSHEh4   2023年11月05日   15   0   0 bash状态码HTTP
  JiJ96DoSHEh4   2023年11月19日   14   0   0 bashlinux
  dUbcXj9lnElT   2023年11月02日   26   0   0 #includei++c++
  dUbcXj9lnElT   2023年11月02日   15   0   0 #include连通块i++
  JiJ96DoSHEh4   2023年11月19日   14   0   0 bashbcsed
  Adn1GC3kyTwd   2023年11月02日   38   0   0 bashmavenapache
p1prOQge3cDY
最新推荐 更多