linux工程师,RHCE
分类: 系统运维
2022-05-19 11:36:42
Linux系统中Shell脚本编写的一点心得
作为一个软件测试人员, 经常会跟开发打交道,产品开发阶段,他们经常会提供一些python,shell等脚本作为bug的临时解决方案以方便测试继续进行。最近接触的shell脚本比较频繁,感觉自己的基础有些薄弱,就自学了下,顺便把获取的知识点总结下,希望也能对需要的人有所帮助。
提到Shell脚本,必不可少的要知道Shell终端解释器,就像java语言,要有java编译器,python语言,要有pycharm等文本编译器一样,它的作用就是人和计算机之间的翻译官,让彼此可以相互交流的工具。作为一门语言,必不可少的要知道这门语言的基础知识以及怎么运用这些基础知识进行业务处理,下边就是对这些基础的总结。
(一) Shell脚本基础
Shell脚本常用交互式和批处理两种方式和计算机交流。所谓交互式是指用户向计算机输入一条指令就立马执行,而批量处理的方式就是把用户想要做的事情事先写好,然后交给计算机一起处理。
一个完整的shell脚本分为三部分,如下example.sh:
#1.脚本声明
#!/bin/bash
#2.对该文本功能的的介绍
#For Example by Shell
#3.用户想实现的逻辑功能
pwd
ls -al
可以尝试用命令bashexample.sh 或./example.sh执行该脚本看下执行结果,有时会提示权限不够,记得检查该脚本的是否有执行权限和执行用户身份。
(二) 如何接收用户参数
上边的脚本程序只能处理一些定义好的功能,不能对输入参数进行灵活处理,当然,Shell脚本语言早也早就贴心的考虑到这些问题,用$表示从外部接收的变量,如$0对应当前shell脚本的名称,$1、$2、$3、$4……分别对应第N个位置的参数。
既然能够从外部接收变量,那么怎么判断从外部输入的变量是否符合要求呢?系统中的Shell脚本语言当然也会考虑到,用条件表达式表示:
测试语句格式:[条件表达式]
注意,条件表达式两边均有一个空格,若条件成立,返回数字0,否则随机返回其他数值。
例如: [ -d /etc/fstab ], 表示判断/etc/fstab是否为目录类型的文件,其返回值可以用 echo $? 来查看。
(三) 流程控制语句
在真实的业务场景中,经常会有很复杂的业务逻辑,通过if,for,while,case这4种流程控制语句来实现,这些业务逻辑跟python,java等编程语言处理逻辑是一样的,只不过语法的表现形式略有不同。
1. If 条件测试语句
If条件语句在shell脚本中的格式:
If 条件测试操作
Then 命令序列
Fi
例如:判断/media/cdrom文件是否存在,若存在就结束,若不存在,就去创建
#!/bin/bash
#For Example by Shell
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
2. For循环语句
For循环语句在shell中的格式:
For 变量名in 取值列表
Do
命令序列
Done
例如:遍历所有的node配置文件configgiles,并在每个node上执行dimension_image_3.1.4.py的python脚本。
ConfigFiles=("image15_B4020S2.cfg" "image38_B4180S2.cfg" "image26_B4120S2.cfg" "image49_9BFNJH2.cfg")
for config in ${ConfigFiles[*]}
do
{
echo "Update PTAB location in file $ConfigHome${PreConfig}/$config"
sed -i '/payload=/'d $ConfigHome${PreConfig}/$config
echo $Pre_payload$PTAB_Build>> $ConfigHome${PreConfig}/$config
echo "-----------Start to image system by $config -----------------------------------"
python3 ${ConfigHome}dimension_image_3.1.4.py -C $ConfigHome${PreConfig}/$config -D -L ${ConfigHome}logs/ -T 4500
}&
done
3. While条件循环语句
while循环语句在shell中的格式:
while 条件测试操作
do
命令序列
Done
例如:针对构建环境的操作,如果成功,则直接结束,否则再次retry,最多retry3次。
loop_times=0
retry_times=3
while [ $loop_times -lt $retry_times ]
do
echo -e "\n Start to setup cluster"
setup_cluster
echo -e "\n Start to wait for cluster complete"
return_code=`echo $?`
if [ $return_code -eq 1 ]; then
let loop_times++;
echo -e "\n Fail to setup cluster, loop time: $loop_times"
else
echo -e "\n Success to setup cluster"
break;
fi
done
4. Case条件测试语句
Case条件测试语句在shell中的格式:
Case 变量值in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……..
Esac
例如:
#!/bin/bash
#For Example by Shell
Read -p “请输入一个字符,并按Enter键确认:” KEY
Case“$KEY”in
[a-z] |[A-Z] )
Echo “您输入的是字母”
;;
[0-9])
Echo “您输入的是数字”
;;
Esac
以上就是总结的shell脚本语言基础以及4种逻辑处理语句的表达方式,更详细的可以参考这本书的第4章,比如,条件测试语句的4种方式:文件、逻辑、整数值、字符串比较测试语句在书中会有更详细的介绍,这里只是粗略的列出大纲,方便回忆知识点。有这方面需要的朋友,这本书真心推荐给你。