shell脚本进阶

一、流程控制

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

1.条件判断

(1)if条件判断

  • 普通if条件判断

格式:

  • 嵌套if条件判断

格式:

(2)case判断

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

格式:

示例:

执行结果:

2、循环

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

(1)for循环

格式:

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

执行机制:

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

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

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

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

(2)while循环

格式:

执行机制:

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

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

进入条件:CONDITION为true

退出条件:CONDITION为false

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

格式:

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

(3)until循环

格式:

进入条件:CONDITION 为false

退出条件:CONDITION 为true

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

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

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

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

练习:

1)打印九九乘法表

shell脚本

2)打印等腰三角形

Shell脚本:

3、select循环与菜单

  • select 循环主要用于创建菜单,按狮子书序排列的菜单项将显示在标准错误上,并显示PS3提符,等待用户输入。
  • 用户输入菜单列表中的某个数字,执行相应的命令
  • 用户输入被保存在内置变量REPLY中
  • Select是个无限循环,因此要用break命令退出循环,或者用exit命令终止脚本,也可以适应ctrl  +c退出循环
  • 经常和case联合使用

示例:

二、trap信号捕捉

  • trap  ‘触发指令‘ 信号

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

  • trap  ‘‘  信号

忽略信号的操作

  • trap  ‘-‘  信号

恢复原信号的操作

  • trap  -p

列出自定义信号操作

示例:

三、函数

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

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

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

1、定义函数

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

语法一:

语法二:

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

2、函数使用

  • 可在交互式环境下定义函数,即直接在bash命令行里写函数和调用函数
  • 可将函数放在脚本文件中作为它的一部分,即可以再同一个脚本文件里调用函数
  • 可放在只包含函数的单独文件中,即在其他shell脚本中可以调用这个文件。使用  .  /path/to/functions_files 或者source  /path/to/functions_files

    函数调用很简单:

  • 无参数:function_name
  • 有参数:  funcation_name ar1 arg2 ……argN , 在函数体,可以使用$1,$2,…调用这些参数,还可以使用$*,[email protected]等特殊变量
  • 函数的生命周期:被调用时创建,返回时终止

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

3、函数返回值

  • 函数有两种返回值:

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

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

  • 函数的退出状态码:

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

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

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

    return0 无错误返回。

    return 1-255 有错误返回

4、函数变量

变量的作用域不同

  • 环境变量:当前shell和子shell有效
  • 本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量作用范围是当前shell脚本程序文件,包括脚本中的函数
  • 局部变量:函数的生命周期;函数结束时变量被自动销毁

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

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

  local NAME=VALUE

5、函数递归

函数直接或间接调用自身

阶乘示例:

6、环境函数

使函数子进程也可使用

声明:export –f 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 "This service isalready running "                                                                              
       else                                                                                                                                             
                touch $var                                                                                                                         
                action " service startsucessfully "                                
       fi
}
stop ()
{
       if [ -e $var  ] ;then
                rm -f $var
                action "service stop"
       else
                action "service is notrunning" false
#               echo "service is notrunning "
       fi
}
restart ()
{
       if [ -e $var ]; then
                sleep 0.5    #间隔时间
                stop
                sleep 0.5
                  start
         else
                  action "service notrunning" /bin/false
                  sleep 0.5
                  start
          fi
  }
 status()
  {
          if [ -e $var ];then
                    echo -e "\tThe service isrunning..."
          else
                   echo -e "\tThe service isnot running..."
          fi
   }
  status()
  {  
          if [ -e $var ];then
                   echo -e "\t The serviceis running"
          else
                   echo -e "\t The serviceis stopd"
         fi
   }
  case $1 in
          start)
                   start
                  ;;
          stop)
                   stop
                   ;;
          restart)
                   restart
                   ;;
          status)
                  status
                   ;;
          *)
                   echo "Please enter thecorrect parameters (start|stop|restart|status)"
  esac
时间: 2024-08-05 15:37:18

shell脚本进阶的相关文章

shell脚本进阶篇(上)

shell脚本是我们学习运维的难点,本篇内容简单举例shell脚本的进阶上篇,有任何技术上的指导,知识上的不足都欢迎指出点明. 流程控制 过程式编程语言: 顺序执行   选择执行  循环执行 条件选择if语句 ? 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3;

shell脚本进阶一(for,while,continue,break,select等等)

脚本进阶一 一.for循环的第二种写法: 众所周知,for有两种写法 第一种:for i in k8s-node{1..3};do setenforce 0;done 第二种写法:C语言风格 直接写怎么用: #for后必须写两个括号,又称双小括号写法 [[email protected] ~]# cat for_2.sh #!/bin/bash for ((i=1,sum=0;i<=100;i++));do let sum+=i done echo "sum=${sum}" [[

shell脚本进阶(一)

一.逻辑运算 变量: 本地变量.环境变量.局部变量.位置参数变量.特殊变量 变量赋值:name=value,export name=value,declare -x name=value 变量引用:$name,${name} 注意:有些时候{}不能省略,例如 echo "$valuemagedu.com" echo "${value}magedu.com" 撤销:unset name bash脚本编程,运行脚本 #!/bin/bash      #称为shebang

shell脚本进阶(二)

select 循环与菜单 select variable in list do 循环体命令 done select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入 用户输入菜单列表中的某个数字,执行相应的命令 用户输入被保存在内置变量REPLY 中. select 是个无限循环,因此要记住用break 命令退出循环,或用exit 命令终止脚本.也可以按ctrl+c 退出循环. select 经常和case 联合使用 与for 循环类似,可以省略

shell脚本进阶之循环判断

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } h1 { margin-top: 15.6pt; margin-right: 0cm; margin-left: 0cm; margin-bottom: .0001pt; text-align: justify; line-he

shell脚本进阶练习题---理解和练习

1.编写脚本/root/bin/createuser.sh, 实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之:显示添加的用户的id号等信息 2.判断/var/目录下所有文件的类型 3.添加10个用户user1-user10,密码为8位随机字符 4.编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态 有几个有意思点的shell脚本 5.九九乘法表 6.等腰三角形 7.国际象棋棋盘 不忘初心 砥砺前行!!! 原文地址:http

shell脚本进阶之信号的捕捉

shell脚本之信号的捕捉 ? trap,翻译过来就是陷阱的意思,shell脚本中的陷阱是专门用来捕捉信号的.啥信号呢?比如经常使用的kill -9,kill -15,CTRL+C等都属于信号 1.查看所有可用的信号 trap -l或kill -l即可 [[email protected] ~]# kill -l 63) SIGRTMAX-1 64) SIGRTMAX [[email protected] ~]# trap -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4)

shell脚本进阶之数组基础

SHELL脚本--shell数组基础 ? 数组和变量的区别:变量在内存中占用的空间是离散的,数组在内粗中开辟一段连续的大内存空间,随后数组中的每个元素都放入数组内存中.数组元素使用index标识. ? bash里有两种数组普通数组和关联数组.普通数组只能使用整数类形数值作为数组索引,关联数组可以使用字符串作为索引.关联数组的另外三种称呼:字典(dict),hash结构和映射(map),是一种key和value一一对应的关系. 一.普通数组 1.1定义普通数组 方法一: [[email prote

Shell脚本进阶练习

1.判断用户输入的数字是否为正整数. #!/bin/bash #判断用户输入的参数是否为正整数 read -p "Please input a digit:" int if [[ "$int" =~ (^[0-9]*[1-9][0-9]*$) ]];then echo "this digit is positive integer" else echo "this digit is not positive integer"