博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20.17 shell中的函数
阅读量:6305 次
发布时间:2019-06-22

本文共 4226 字,大约阅读时间需要 14 分钟。

hot3.png

20.17 shell中的函数

函数:就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。

格式: function f_name() {
                      command
             }
函数必须要放在最前面;

示例1:

#!/bin/bashinputt() {    echo $1 $2 $# $0}input 1 a b

注意:函数里面function可以省略,但f_name不要和系统env变量相同,如"for""input"一定要区分开来;

函数本事不会自动执行,只有你调用之后 才会生效;
$1:第一个参数;
$2:第二个参数;
$0:脚本名称;
$#:参数的数量(计算有多少参数);

脚本解析:

这个脚本并没有交互,预先脚本里面设定了参数;

[root@DasonCheng sbin]# cat funca.sh #!/bin/bashfunction inputt() {    echo "The first par is $1"    echo "The second par is $2"    echo "The third par is $3"    echo "The script name is $0"    echo "The number of par is $#"}inputt 1 2 3 a b cde    ##这里就会调用上面的inputt函数;后面接的是参数![root@DasonCheng sbin]# sh funca.sh The first par is 1The second par is 2The third par is 3The script name is funca.shThe number of par is 6    ##总共有6个参数;

示例2:

#!/bin/bashsum() {    s=$[$1+$2]    echo $s}sum 1 2

脚本解析:

[root@DasonCheng sbin]# cat funca2.sh #!/bin/bashfunction sum () {    s=$[$1+$2]    echo "$1+$2=$s"}sum 1 10[root@DasonCheng sbin]# sh funca2.sh 1+10=11

示例3:

#!/bin/baship() {    ifconfig |grep -A1 "$1 " |tail -1 |awk '{print $2}''}read -p "Please input the eth name: " emyip=`ip $e`echo "$e address is $myip"

提示:ip函数里面的命令不清楚的话,那就管道一个一个执行;可以换为以下命令:

[root sbin]# ifconfig |grep -w -A1 "ens33:" |awk '/inet/ {print $2}'
[root sbin]# ifconfig |grep -A1 "ens33: " |awk '/inet/ {print $2}'

脚本解析:

[root@DasonCheng sbin]# cat funca3.sh #!/bin/bashfunction ip() {    ifconfig |grep -A1 "$e: " |awk '/inet/ {print $2}'}read -p "Please input the eth name:" emyip=`ip $e`echo "$e address is $myip"[root@DasonCheng sbin]# sh funca3.sh Please input the eth name:ens33ens33 address is 192.168.60.11[root@DasonCheng sbin]# sh funca3.sh Please input the eth name:ens37ens37 address is 192.168.80.128

脚本拓展:

需求:求出 当用户输入的不是系统内的网卡时或者没有输入时,应该怎样输出?(判断)

[root@DasonCheng sbin]# cat funct3.sh#!/bin/bashfunction ip() {    ifconfig |grep -A1 "$e: " |awk '/inet/ {print $2}'}while :      ##这个while循环,我是用来判断输入值为的空或者网卡系统里面没有的!doread -p "Please input the eth name:" e    if [ -z $e ]    then      echo "Warnng: please input the eth name!"      continue    fisure=`ifconfig |grep "$e: " |wc -m`    if [ $sure -le 0 ]    then      echo "The $e is out of your system,please input again!"    else      break    fidonemyip=`ip $e`echo "$e address is $myip"[root@DasonCheng sbin]# sh funct3.shPlease input the eth name:Warnng: please input the eth name!Please input the eth name:asdfThe asdf is out of your system,please input again!Please input the eth name:ens33ens33 address is 192.168.60.11[root@DasonCheng sbin]# sh funct3.shPlease input the eth name:ens37ens37 address is 192.168.80.128

20.18 shell中的数组

shell中的数组1:

定义数组 a=(1 2 3 4 5); echo ${a[@]}

  • echo ${#a[@]} 获取数组的元素个数
  • echo ${a[2]} 读取第三个元素,数组从0开始
  • echo ${a[*]} 等同于 ${a[@]} 显示整个数组

数组赋值

  • a[1]=100; echo ${a[@]}
  • a[5]=2; echo ${a[@]} 如果下标不存在则会自动添加一个元素

数组的删除

  • unset a; unset a[1]
[root@DasonCheng sbin]# a=(1 2 3 4 5)    ##定义一个数组;[root@DasonCheng sbin]# echo ${a[@]}    ##显示所有数组 @和*效果一样;1 2 3 4 5[root@DasonCheng sbin]# echo ${a[*]}1 2 3 4 5[root@DasonCheng sbin]# echo ${#a[*]}    ##显示数组元素个数;5[root@DasonCheng sbin]# echo ${a[2]}    ##显示数组第2个元素值,数组是按0开始算的;3

shell中的数组2:

数组分片:

  • a=(seq 1 5)
  • echo ${a[@]:0:3} 从第一个元素开始,截取3个
  • echo ${a[@]:1:4} 从第二个元素开始,截取4个
  • echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个

数组替换:

  • echo ${a[@]/3/100}
  • a=(${a[@]/3/100})
[root@DasonCheng sbin]# a=(`seq 1 10`)[root@DasonCheng sbin]# echo ${a[*]}1 2 3 4 5 6 7 8 9 10[root@DasonCheng ~]# echo ${a[*]:0:3}    ##从第一个元素开始,截取3个元素;1 2 3[root@DasonCheng ~]# echo ${a[*]:2:4}3 4 5 6[root@DasonCheng ~]# echo ${a[*]:0-3:2}     ##从倒数第三个元素开始,截取2个元素;8 9[root@DasonCheng ~]# a=(${a[*]/3/100})    ##数组替换:将元素3替换为100(并不是将第3个替换为100,需要区分开来)[root@DasonCheng ~]# echo ${a[*]}1 2 100 4 5 6 7 8 9 10[root@DasonCheng ~]# echo ${a[*]/4/200}    ##将元素4替换为200,仅仅显示在屏幕上!1 2 100 200 5 6 7 8 9 10[root@DasonCheng ~]# echo ${a[*]}1 2 100 4 5 6 7 8 9 10

20.19 告警系统需求分析

Shell项目-告警系统:

  • 需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。
  • 思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等。
  • 主程序:作为整个脚本的入口,是整个系统的命脉。
  • 配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件。
  • 子程序:这个才是真正的监控脚本,用来监控各个指标。
  • 邮件引擎:是由一个python程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码
  • 输出日志:整个监控系统要有日志输出。

要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。

mark

转载于:https://my.oschina.net/u/3651233/blog/1537691

你可能感兴趣的文章
Socket通道
查看>>
微信接口调用返回码一览表
查看>>
PCI Express(四) - The transaction layer
查看>>
vue-router 使用a链接跳转至二级子页面偶尔会出现地址栏看不见路由和参数的情况...
查看>>
连接mongodb服务
查看>>
2017 ACM/ICPC Asia Regional Qingdao Online 1011 A Cubic number and A Cubic Number
查看>>
创建多个线程、互斥量、死琐
查看>>
shell自定义函数
查看>>
windows 7 资源管理器预览 js 文件方法
查看>>
《构建之法》阅读笔记五
查看>>
Python 异常处理
查看>>
ABP Zero示例项目问题总结
查看>>
XMPP_05_网络编程
查看>>
数码测评网站
查看>>
Java:对double值进行四舍五入,保留两位小数的几种方法
查看>>
【CUDA学习】内核程序调试
查看>>
linux下tar.xz 文件解压
查看>>
linux 命令
查看>>
(转)hadoop 集群间数据迁移
查看>>
违和感_百度百科
查看>>