欢迎重视Android茶话会」

  1. 「学习之路」 取Android技术道路经典电子书
  2. 「pdf」取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。
  3. 「天边」 取天边论坛200+精彩博文,包括小说、形而上学等

背景

之前在搞一些CI/CD,运用到了shell脚本,shell的开箱即用确实比较便利,至少无需在宿主上安装运转环境,本篇文章首要解说shell脚本实践过程中一些经验总结。

本篇是 实践篇

入门篇在 mp.weixin.qq.com/s?__biz=MzU…

模块化

刚开始看一些之前的shell脚本,一个脚本大几百行,很少有函数的情况,其实shell脚本也能够函数化,按照模块的拆分,这样就会带来杰出的可读性和可维护性,通常咱们会先界说main函数,将功能分解为一个个子函数

  • 模块化之前
    Shell编程从入门到实践 ——实践篇
  • 模块化之后
    Shell编程从入门到实践 ——实践篇
#!/bin/bash
localvar="fun1"
main(){
func1
func2
}
func1(){
locallocalvar="funlocal"
echo${localvar}
localvar="fun2"
}
func2(){
echo${localvar}
}
main"$@"

函数

函数是模块化的基础,一个函数往往担任一件事情

  • 函数名后边的圆括号不加任何参数
  • 函数的完好界说有必要置于函数的调用之前
函数名(){
函数体
}

传参

#!/bin/bash
print_something(){
echo"hello$1"#$1获取第一个参数
}
print_somethingLion#Lion为参数
print_somethingFrank#Frank为参数
$1~$9:函数的第一个到第9个的参数。
$0:函数地点的脚本名。
$#:函数的参数总数。
$@:函数的悉数参数,参数之间运用空格分隔。
$*:函数的悉数参数,参数之间运用变量$IFS值的第一个字符分隔,默许为空格,可是能够自界说。
$?:显示最终指令的退出状况。0表明没有过错,其他任何值表明有过错。能够用于函数回来值

回来值

testFun(){
echo"helloworld!"
return99
}
#千万要注意shell并不像其他言语直接回来回来值,其回来值放到$?中,这也是为什么只能回来整型的原因
#所以这种接受方法是过错的,获取到的值是echo打印的内容
#return_value=`testFun`
#以下才是正确获取经过return回来的回来值的正确写法
testFun
echo"thereturnvalueis:$?"

局部变量

  • 不做特别声明,shell中变量都是全局变量
  • 局部变量 运用 「local」 关键字,函数表里同时存在同名变量,则函数内部会掩盖函数外部变量

脚本之间引证

模块化之后多个脚本和公共参数之间是能够相互复用的 这时候能够经过 souce或许点号来调用所需求的脚本

source./util.sh
../util.sh

过错处理

假如什么都不做,在shell中指令犯错也不影响,默许会继续履行,这会带来费事,有时候咱们需求区别事务过错和体系过错,比如在脚本履行遇到体系过错之后就应该退出,遇到事务过错,需求根据事务过错来确定是否往下履行,有以下几种方法来控制shell的过错

set 指令

  • set -e

只需脚本发生过错就停止履行,set +e表明封闭-e选项,set -e表明从头翻开-e选项,可是要注意这个指令不适与管道操作

set+e
command1
command2
set-e

管道处理需求凭借

  • set -o pipeline

通常咱们会把这些指令放在一起运用

#写法一
set-Eeuxopipefail
#写法二
set-Eeux
set-opipefail

短路符号

假如command正常退出,回来0,|| 运算符右半部分被短路,脚本继续履行。 假如command异常退出,回来非0, 运算符右半部分履行,脚本exit 1。

command||exit1
#写法一
command||{echo"commandfailed";exit1;}
#写法二
if!command;thenecho"commandfailed";exit1;fi
#写法三
command
if["$?"-ne0];thenecho"commandfailed";exit1;fi

运用trap 捕获信号量

用来在bash脚本中响应体系信号,trap指令有必要放在脚本的开头。不然,它上方的任何指令导致脚本退出,都不会被它捕获。规范格局

$trap[动作][信号1][信号2]...

HUP:编号1,脚本与地点的终端脱离联络。 INT:编号2,用户按下 Ctrl + C,意图让脚本停止运转。 QUIT:编号3,用户按下 Ctrl + 斜杠,意图退出脚本。 KILL:编号9,该信号用于杀死进程。 TERM:编号15,这是kill指令宣布的默许信号。 EXIT:编号0,这不是体系信号,而是 Bash 脚本特有的信号,不管什么情况,只需退出脚本就会产生。

$trap'rm-f"$TMPFILE"'EXIT

表明 脚本遇到EXIT信号时,就会履行rm -f “$TMPFILE”

调试

也没有特别好的方法,能够让不同级别的日志打印出不同的颜色

functiondebug()
{
echo-e"\033[37m$1\033[0m"
}
functioninfolog()
{
echo-e"\033[32m$1\033[0m"
}
functionwarn()
{
echo-e"\033[33m$1\033[0m"
}
functionerror()
{
echo-e"\033[31m$1\033[0m"
}

其他细节

预界说默许值

  • ${varname:-word} varname存在且不为空,则回来它的值,不然回来word
  • ${varname:=word} varname存在且不为空,则回来它的值,不然将它设置为word并回来word
  • ${varname:+word} varname存在且不为空,在回来word,不然回来空值,它的意图是测试变量是否存在
  • ${varname:?message} 假如变量varname存在且不为空,则回来它的值,不然打印出varname: message,并中止脚本的履行,它的意图是防止变量未界说

()与{}的区别

前者用于指令履行,回来指令回来值

all_files=`ls`#获取ls指令的履行成果
all_files=$(ls)#作用同上

后者用于变量打开

echo${A}B

[]和[[ ]] 、(())

在运用[]或许test指令进行字符串判空时,需求在引证的变量上加上双引号””。 假如运用[[]]的话就不需求。 $(())用来做整数运算的

curl中携带参数

curl中需求用单引号,数字和字符还不相同,注意tesMsg

jobId="78707463"
tesMsg="msg:需求找专人批阅"
curl -X POST https://xxxx/openapi/xxxx/job/update_msg -H "Content-Type: application/json" -d '{
"jobId":'$jobId',
"jobMsg":"'"${tesMsg}"'"
}'
  1. 「学习之路」 取Android技术道路经典电子书
  2. 「pdf」取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。
  3. 「天边」 取天边论坛200+精彩博文,包括小说、形而上学等

您的 点赞、谈论、转发 是对我的巨大鼓励!

Shell编程从入门到实践 ——实践篇