shell脚本进阶

前端之家收集整理的这篇文章主要介绍了shell脚本进阶前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、流程控制

流程控制语句,即用来实现对程序流程的选择、循环和返回等进行控制的语句。

1.条件判断

1if条件判断

格式:

wKiom1m-MGuC-yPxAAD7TYZK3nc469.png

格式:

wKioL1m-MNbSPKI3AAGKdxbZlqw758.png

(2)case判断

简洁版多分支if语句,当if语句有多个elif时可以使用case语句代替,语言更简洁容易理解。使用场景:判断某个变量值是否为多种情形中的一种时使用。

格式:

wKioL1m-MV3AnW-2AADDG067ZwA719.png

示例:

wKiom1m-Mb_idPglAADfUav2Blg399.png

执行结果:

wKioL1m-MazwpvD-AABnhVkLnyA405.png

2、循环

循环执行就是将循环体内的代码重复运行多次;运行的次数由进入循环的条件和退出循环决定。

(1)for循环

格式:

wKiom1m-MoqQSk2wAAA4clz9QXs908.png

列表:变量的取值范围,可以是变量的取值范围,也可以是某个变量的执行结果。

执行机制:

依次将列表中的元素赋值“变量名”,每次赋值即执行一次循环体,直到列表中的元素耗尽,循环结束。

注:for循环的特殊格式:for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))

控制变量初始化:仅在运行到循环代码段时执行一次

控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

(2)while循环

格式:

wKiom1m-M5rij3OpAAAzzLhv_OY075.png

执行机制:

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环

因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

进入条件:CONDITION为true

退出条件:CONDITION为false

注:while的特殊用法:(遍历文件的每一行)

格式:

wKiom1m-NG2QkN_MAABJDzvUN_g822.png

在执行循环的时候依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

(3)until循环

格式:

wKioL1m-NIKhb0swAAAy_FlIN5Q158.png

进入条件:CONDITION false

退出条件:CONDITION true

(4)循环控制语句continue, break 以及shift

  • 用于循环体内

  • continue 用于结束本轮循环,而进入下一轮循环

Break 用于结束整个循环 ,不会进入下一轮循环

  • shift用于将参数列表list左移指定次数,默认为一次,在处理参数不确定的情况下比较好用。

练习:

1)打印九九乘法表

wKioL1m-NZiy53usAAF85Y_o23A319.png

shell脚本

wKioL1m-NdHAgmBmAACNXU5Gq08229.png

2)打印等腰三角形

wKiom1m-NkDhz0eyAABXAs8P3fU218.png


Shell脚本:

wKiom1m-NoXR1vSkAADKL9zFRyg600.png


3、select循环与菜单

  • select 循环主要用于创建菜单,按狮子书序排列的菜单项将显示在标准错误上,并显示PS3提符,等待用户输入。

  • 用户输入菜单列表中的某个数字,执行相应的命令

  • 用户输入被保存在内置变量REPLY

  • Select是个无限循环,因此要用break命令退出循环,或者用exit命令终止脚本,也可以适应ctrl +c退出循环

  • 经常和case联合使用

示例:

wKioL1m-NyPD-NwoAADwRYtrU8s993.png

二、trap信号捕捉

  • trap '触发指令'信号

自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作

  • trap '' 信号

忽略信号的操作

  • trap '-' 信号

恢复原信号的操作

  • trap -p

列出自定义信号操作

示例:

wKiom1m-OIuR5kU7AADwRYtrU8s207.png

三、函数

把一段具有独立功能代码封装在一起,并给予命名,后续用到的时候,可以直接通过给定函数名来调用整体函数,使用函数可以实现代码的重用和模式化编程。函数在形式上和shell程序在形式上是相似的,不同的是他不是一个单独的进程,不能单独运行,而是shell程序的一部分。

函数shell程序比较相似,区别在于:

  • Shell程序是在子shell中运行

  • Shell函数是在当前shell中运行,因此在当前shell中,函数可以更改shell中的变量

1、定义函数

函数有两部分组成:函数名和函数

语法一:

wKioL1m-OOuiO_mcAAAsmz-D7Cg447.png

语法二:

wKiom1m-OS6S038sAAAxMWfVXHQ302.png

语法三:(最简便也是最常见的)

wKioL1m-OSOwnfHrAAAox-E31tA114.png

2、函数使用

  • 可在交互式环境下定义函数,即直接在bash命令行里写函数调用函数

  • 可将函数放在脚本文件中作为它的一部分,即可以再同一个脚本文件调用函数

  • 可放在只包含函数的单独文件中,即在其他shell脚本中可以调用这个文件。使用. /path/to/functions_files 或者source /path/to/functions_files

    函数调用很简单:

  • 无参数:function_name

  • 有参数: funcation_name ar1 arg2 ……argN 函数体,可以使用$1,$2,…调用这些参数,还可以使用$*,$@等特殊变量

  • 函数的生命周期:被调用时创建,返回时终止

declare -f :查看系统里的函数

wKiom1m-OozSHyLOAAEieJIN2PA653.png

3函数返回值

(1)使用echo等命令进行输出

(2) 函数体中调用命令的输出结果

(1) 默认取决于函数中执行的最后一条命令的退出状态码

(2) 自定义退出状态码,其格式为:

return 函数中返回,用最后状态命令决定返回值

return0 错误返回。

return 1-255 错误返回

4函数变量

变量的作用域不同

  • 环境变量:当前shell和子shell有效

  • 本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量作用范围是当前shell脚本程序文件包括脚本中的函数

  • 局部变量:函数的生命周期;函数结束时变量被自动销毁

由于函数是在当前shell中执行,当函数体中有变量的时候,容易与函数体外的变量产生冲突,这时候可以使用局部变量。

函数中定义局部变量的方法

local NAME=VALUE

5函数递归

函数直接或间接调用自身

阶乘示例:

wKioL1m-O4OTTMJwAABhXZReAM4485.png

6、环境函数

使函数子进程也可使用

声明:export �Cf function_name

查看:export -f 或者declare -xf

函数练习示例:

编写服务脚本/root/bin/testsrv.sh,完成如下要求

(1) 脚本可接受参数:start,stop,restart,status

(2) 如果参数非此四者之一,提示使用格式后报错退出

(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME,显示启动成功

考虑:如果事先已经启动过一次,该如何处理?

(4) 如是stop:删除/var/lock/subsys/SCRIPT_NAME,显示停止完成

考虑:如果事先已然停止过了,该如何处理?

(5) 如是restart,则先stop,start

考虑:如果本来没有start,如何处理?

(6) 如是status,则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示SCRIPT_NAMEisrunning...”

如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示SCRIPT_NAMEis stopped...”

其中:SCRIPT_NAME为当前脚本名

#!/bin/bash
./etc/init.d/functions
var='/var/lock/subsys/script_service'
start()
{
if[-e$var];then
echo"Thisserviceisalreadyrunning"
else
touch$var
action"servicestartsucessfully"
fi
}
stop()
{
if[-e$var];then
rm-f$var
action"servicestop"
else
action"serviceisnotrunning"false
#echo"serviceisnotrunning"
fi
}
restart()
{
if[-e$var];then
sleep0.5#间隔时间
stop
sleep0.5
start
else
action"servicenotrunning"/bin/false
sleep0.5
start
fi
}
status()
{
if[-e$var];then
echo-e"\tTheserviceisrunning..."
else
echo-e"\tTheserviceisnotrunning..."
fi
}
status()
{
if[-e$var];then
echo-e"\tTheserviceisrunning"
else
echo-e"\tTheserviceisstopd"
fi
}
case$1in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo"Pleaseenterthecorrectparameters(start|stop|restart|status)"
esac
原文链接:https://www.f2er.com/bash/390571.html

猜你在找的Bash相关文章