[Linux][Shell][Shell逻辑控制]详细教学

海哥  金牌会员 | 2024-7-20 02:04:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 534|帖子 534|积分 1602


1.if 判断

1.if-then



  • 语法
    1. if command
    2. then
    3.         command
    4. fi
    复制代码
  • bash的if语句和其他编程语言不一样,bash的if语句会直接运⾏if后⾯的命令

    • 如果该命令执⾏正确(状态码为0),处于then的命令就会被执⾏
    • 否则就不会执行,或者执行其他逻辑的语句,最后到fi结束逻辑控制

2.if-then-else



  • 语法
    1. if command
    2. then
    3.         command
    4. else
    5.         command
    6. fi
    复制代码
3.elif



  • 语法
  1. if commandthen        commandelif command
  2. then
  3.         command
  4. fi
复制代码
4.case



  • 可以取代多if-else分支
    1. case "变量" in
    2. 值1)
    3. 命令
    4. ;;
    5. 值2)
    6. 命令2
    7. ;;
    8. *)
    9. 命令
    复制代码
5.现实上手



  • 内存监控
    1. #!/bin/bash
    2. FreeMem=`free -m | awk 'NR==2 {print $NF}'`
    3. CHARS="Current memory is $FreeMem"
    4. if [ "$FreeMem" -lt 16000 ]
    5. then
    6.     echo $CHARS
    7.     echo "内存不足,抓紧维护服务器!"
    8. fi
    复制代码
  • 读取比力巨细

    • 单分支版本
      1. #!/bin/bash
      2. a=$1
      3. b=$2
      4. if [ $a -lt $b ]
      5. then
      6.     echo "Yes, $a less than $b"
      7.     exit 0
      8. fi
      9. if [ $a -eq $b ]
      10. then
      11.     echo "Yes, $a equal $b"
      12.     exit 0
      13. fi
      14. if [ $a -gt $b ]
      15. then
      16.     echo "Yes, $a greater than $b"
      17.     exit 0
      18. fi
      复制代码
    • 多分支版本
      1. #!/bin/bash
      2. a=$1
      3. b=$2
      4. if [ $a -lt $b ]
      5. then
      6.     echo "Yes, $a less than $b"
      7.     exit 0
      8. elif [ $a -eq $b ]
      9. then
      10.     echo "Yes, $a equal $b"
      11.     exit 0
      12. else [ $a -gt $b ]
      13.     echo "Yes, $a greater than $b"
      14.     exit 0
      15. fi
      复制代码

  • MySQL监控脚本
    1. #!/bin/bash
    2. if [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    3. then
    4.     echo "MySQL is running"
    5. else
    6.     echo "MySQL is stopped"
    7.     # systemctl start mysql.service
    8. fi
    复制代码
  • Rsync启动脚本
    1. #!/bin/bash
    2. if [ "$#" -ne 1 ]
    3. then
    4.     echo "Usage: $0 {start|stop|restart}"
    5.     exit 1
    6. fi
    7. if [ "$1" = "start" ]
    8. then
    9.     /usr/bin/rsync --daemon
    10.     sleep 2
    11.     if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]
    12.     then
    13.         echo "Rsync is started"
    14.         exit 0
    15.     fi
    16. elif [ "$1" = "stop" ]
    17. then
    18.     killall rsync &>/dev/null
    19.     sleep 2
    20.     if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]
    21.     then
    22.         echo "Rsync is stopped"
    23.         exit 0
    24.     fi
    25. elif [ "$1" = "restart" ]
    26. then
    27.     kill rsync
    28.     sleep 1
    29.     killpro=`netstat -tunlp | grep rsync | wc -l`
    30.     /usr/bin/rsync --daemon
    31.     sleep 1
    32.     startpro=`netstat -tunlp | grep rsync | wc -l`
    33.     if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]
    34.     then
    35.         echo "Rsync is restarted"
    36.         exit 0
    37.     fi
    38. else
    39.     echo "Usage: $0 {start|stop|restart}"
    40.     exit 1
    41. fi
    复制代码

2.条件测试

0.事前说明



  • 条件测试常用的语法

  • 常用字符串测试操作符

  • 数值比力

  • 逻辑操作符

  • 各命令对照表


1.test 命令



  • test命令最短的定义可能是评估⼀个表达式

    • 如果条件为真,则返回⼀个0值
    • 如果表达式不为真,则返回⼀个⼤于0的值—,也可以将其称为假值
    • 检查最后所执⾏命令的状态的最轻巧⽅法是使⽤$?值

  • 参数

    • 关于某个文件名的类型侦测(存在与否),如:test -e filename
           参数意义-e该 文件名 是否存在-f该 文件名 是否为文件(file)-d该 文件名 是否为目次(directory)-b该 文件名 是否为block device装置-c该 文件名 是否为一个character device装置-S该 文件名 是否为一个Socket文件-p该 文件名 是否为一个FIFO(pile)文件-L该 文件名 是否为一个毗连档
    • 关于文件的权限侦测,如:test -r filename
           参数意义-r该 文件名 是否具有可读的属性-w该 文件名 是否具有可写的属性-x该 文件名 是否具有可执行的属性-u该 文件名 是否具有SUID的属性-g该 文件名 是否具有SGID的属性-k该 文件名 是否具有Sticky bit的属性-s该 文件名 是否为非空缺文件
    • 关于两个文件之间的比力,如:test file1 -nt file2
           参数意义-nt(newer than),判断file1是否比file2新-ot(older than),判断file1是否比file2旧-ef判断file1与file2是否为同⼀⽂件,可⽤在硬链接的判断上
      重要意义在判断,两个⽂件是否均指向同⼀个inode
    • 关于两个整数之间的判断,如:test num1 -eq num2
           参数意义-eq两数相当-ne两数不相当-gtnum1大于num2-ltnum1小于num2-genum1大于等于num2-lenum1小于等于num2
    • 判断字符串的数据
           参数意义-z为空串,则返回true-n不为空串,则为true=str1 == str2,则返回true!=str1 != str2,则返回true
    • 多重条件判断,如:test -r filename -a -x filename
           参数意义-a(and)两状态同时成立-o(or)两状态任何一个成立!逻辑取反


2.[]



  • 脚本中经常举行条件测试,用的最多的,就是中括号[]
  • test和[]的作用是一样的
  • 根本要素

    • []两个符号,左右都要有空格分隔
    • 内部操作符与操作变量之间要有空格,如:[ "a" = "b" ]
    • 字符串比力中,> <需要写成\> /<举行转义
    • []中字符串或者${}变量只管利用""双引号括住,制止值未定义引用
      1. [ -n "$filename" ]
      复制代码
    • []中可以利用-a -o举行逻辑运算,不支持&& ||
    • []是bash内置命令


3.双括号

1.(())



  • bash支持双小括号,写入高级数学表达式
2.[[]]



  • 双中括号提供了针对字符串的⾼级特性,模式匹配,正则表达式的匹配
  • 根本要素

    • [[]]两个符号,左右都要有空格分隔
    • 内部操作符与操作变量之间要有空格,如:[[ "a" = "b" ]]
    • 字符串比力中,可以直接利用> <,无需转义
    • [[]]中字符串或者${}变量只管利用""双引号括住

      • 如未利用""双引号括住的话,会举行模式和元字符匹配

    • [[]]内部可以利用&& ||举行逻辑运算
    • [[]]是bash的keyword
    • [[]]其他用法都和[]一样


4.现实上手



  • 测试逻辑判断
    1. #!/bin/bash
    2. read -p "Pls input a char:> " var1
    3. [ "${var1}" -eq 1 ] && {
    4.     echo ${var1}
    5.     exit 0
    6. }
    7. [ "$var1" -eq 2 ] && {
    8.     echo $var1
    9.     exit 0
    10. }
    11. [ "$var1" -ne "1" -a "$var1" -ne "2" ] && {
    12.     echo "Script Error"
    13.     exit 1
    14. }
    复制代码
  • 模拟安装脚本
    1. #!/bin/bash
    2. path=/scripts
    3. [ ! -d "$path" ] && mkdir -p scripts
    4. cat << END
    5.         1.[install lamp]
    6.         2.[install inmp]
    7.         3.[exit]
    8. END
    9. read -p "Pls input your choice:> " num
    10. # 判断输入是否合法
    11. [[ ! $num =~ [1-3] ]] && {
    12.         echo "The num you input must be in {1|2|3}"
    13.         echo "Input Error"
    14.         exit 1
    15. }
    16. [ $num -eq 1 ] && {
    17.         echo "start installing lamp...waiting..."
    18.         sleep 2
    19.         # 如果该脚本没权限
    20.         [ ! -x "$path/lamp.sh" ] || {
    21.                 echo "The file does not exit or can't be exec"
    22.                 exit 2
    23.         }
    24.         # 安装脚本
    25.         source ${path}/lamp.sh
    26.         exit $?
    27. }
    28. [ $num -eq 2 ] && {
    29.         echo "start installing lnmp...waiting..."
    30.         sleep 2
    31.         [ ! -x "$path/lnmp.sh" ] || {
    32.                 echo "The file does not exit or can't be exec"
    33.                 exit 3
    34.         }
    35.         source ${path}/lnmp.sh
    36.         exit $?
    37. }
    38. [ $num -eq 3 ] && {
    39.         echo "Bye~"
    40.         exit 4
    41. }
    复制代码

3.循环

1.for



  • 语法
    1. for var in list
    2. do
    3.         commands
    4. done
    复制代码
  • 支持C语言风格
    1. for (( i=1;i<=10;i++ ))
    2. do
    3.         echo "The next number is $i"
    4. done
    复制代码

2.while



  • 语法:此处的test command和if-else语句格式一样,可以利用任何的bash命令

    • 注意:while的test command的退出状态码,必须随着循环⾥的命令改变,否则状态码如果不变化,循环会不停⽌的继续下去
      1. while test command
      2. do
      3.         commands
      4. done
      复制代码

  • while命令可以写入多个测试命令

    • 只有最后一个测试命令的退出状态码会被决定是否退出循环
    • 注意换行,多个测试命令要单独的出如今每一行
      1. var1=10
      2. while echo $var1
      3.         [ $var1 -ge 0 ]
      4. do
      5.         echo "This is inside the loop"
      6.         var1=$[ $var1 -1 ]
      7. done
      复制代码


3.until命令



  • until和while是相反的语意,until命令要求你指定⼀个返回⾮零退出码的测试命令

    • 只有退出状态码不是0,bash才会执⾏循环的命令

  • 语法
    1. until test commands
    2. do
    3.         other commands
    4. done
    复制代码
  • until也⽀持多个测试命令,只有最后⼀个决定bash是否执⾏其他命令
    1. until echo $var1
    2.         [ $var1 -eq 0 ]
    3. do
    4.         echo "Inside the loop:$var1"
    5.         var1=$[ $var1 - 25 ]
    6. done
    复制代码

4.控制循环

1.break



  • 作用:强制退出任意类型的循环

    • 跳出多个循环时,break会主动停止所在的最内存循环

  • 停止外层循环:n体现跳出的循环层级,默认是1,下一层就是2
    1. break n
    复制代码
2.continue



  • 作用:跳过某次循环,直接去本次循环的判断部分

5.处置惩罚循环的输出



  • 在shell脚本⾥,循环输出后的结果,可以进⾏输出重定向
    1. for (( a = 1;a<10;a++ ))
    2. do
    3.         echo "The number is $a"
    4. done > test.txt
    5. echo "Finished"
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表