ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

    • Linux基础

    • Linux服务

    • Windows Server笔记

    • Shell笔记

      • Shell脚本介绍与变量
      • Shell流程控制与函数
        • IF判断语法
          • 单分支结构
          • 双分支结构
          • 多分支结构
          • 条件判断语句
        • CASE判断语法
        • FOR循环语法
          • 一般写法
          • C语言风格写法
          • FOR循环并发执行
          • 流程控制语句
        • WHILE循环语法
        • SHELL函数
          • 函数介绍
          • 定义Shell函数
          • Shell函数传参
          • 调用Shell函数
          • Shell函数返回值
      • Shell脚本常见应用
    • Ansible笔记

  • 虚拟化服务

  • 数据库服务

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 操作系统
  • Shell笔记
Hoshinozora
2023-04-05
目录

Shell流程控制与函数

# IF判断语法

用于判断条件返回值是否为0,如果为0则表示条件成立。

# 单分支结构

  • 如果条件成立则命令 ,否则不执行命令。

    if [ 条件判断条件 ];then
        [命令]
        ... ...
    fi
    
    1
    2
    3
    4

# 双分支结构

  • 如果条件成立则执行命令1,否则执行命令2。一条if语句中else最多只能有1个。

    if [ 条件判断条件 ];then
        [命令1]
    else
        [命令2]
    fi
    
    1
    2
    3
    4
    5

# 多分支结构

  • 如果条件1成立则执行命令1,否则判断条件2。一条if语句中elif可有多个。

    if [ 条件判断条件1 ];then
        [命令1]
    elif [ 条件判断条件2 ];then
        [命令2]
    fi
    
    1
    2
    3
    4
    5

# 条件判断语句

  • 条件判断格式:[ 判断条件 ],例如:[ $? -eq 0 ]

    • 成立则为真,返回0,不成立则为假,则返回非0。为真则表示满足条件,将会执行命令。

    • 条件判断语句也可直接单独使用,但不如配合IF语句直观,例如:

      # 如果$test -eq 123条件成立,则执行echo "yes",否则执行echo "no"
      [ $test -eq 123 ] && echo "yes" || echo "no"
      
      # 同等于
      if [ $test -eq 123 ];then
          echo "yes"
      else
          echo "no"
      fi
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
  • 取相反结果

    • ! - 判断结果取反
      • 将比较符意义取相反即可。也就是如果判断结果成立则取假,如果判断结果不成立则取真。
      • 例子:[ ! $test -eq 123 ]
  • 数值比较

    • 进行数值判断时使用,使用例子:[ $test -eq 123 ]。

    • -eq - 等于则为真

    • -ne - 不等于则为真

    • -gt - 大于则为真

    • -lt - 小于则为真

    • -ge - 大于等于则为真

    • -le - 小于等于则为真

    • 字符串比较

      • 比较字符串,字符串和变量都必须加双引号,不然可能无法正常判断,使用例子:[ $mystr == "233" ]、[ -z "$test" ]。
      • == - 等于则为真
      • != - 不等于则为真
      • -z - 变量没有内容则为真
      • -n - 变量有内容则为真
    • 文件比较

      • 比较文件,对指定路径的文件进行条件判断,使用例子:[ -f /etc/hosts ]
      • -e - 如果文件或目录存在则为真
      • -d - 如果文件存在且为目录则为真
      • -s - 如果文件存在且不为空则为真
        • 可用于删除没用的空文件,节省inode空间。
      • -r - 如果文件存在且有读权限则为真
      • -w - 如果文件存在且有写权限则为真
      • -x - 如果文件存在且有执行权限则为真
    • 多条件逻辑比较

      • 使用[]时 可以使用-a和-o来进行逻辑判断。
        • -a - 并且,例如:[ 1 -ne 2 -a 2 -eq 2 ]
        • -o - 或者,例如:[ 1 -eq 2 -o 2 -eq 2 ]
      • 使用[[]]时,可以使用逻辑比较符号进行比较。
        • && - 并且,例如:[[ 1 -ne 2 && 2 -eq 2 ]]
        • || - 或者,例如:[[ 1 -eq 2 || 2 -eq 2 ]]
        • =~ - 正则等于匹配,例如:[[ $USER =~ ^roo ]]
          • 如果匹配成功则为真。
      • 也可以在[]之外使用逻辑比较符。
        • && - 并且,例如:[ 1 -eq 1 ] && [ 2 -eq 2 ]
        • || - 或者,例如:[ 1 -eq 3 ] || [ 2 -eq 2 ]
    • 判断命令返回值

      • 一般通过$?变量判断即可,例如:

        echo "test"
        if [ $? -eq 0 ];then
        ... ...
        
        1
        2
        3

# CASE判断语法

  • 如果$变量的值与指定值相等,则会执行其中的命令。

    # 格式
    case $变量 in
    匹配条件1)
        [命令]
        ;;
    匹配条件2)
        [命令]
        ;;
    匹配条件...)
        [命令]
        ;;
    *)
        [无匹配则执行的命令]
    esac
    
    # 例子
    case $test in
    1)
        echo "你输入的是test"
    b|break|q)
        echo "你输入的是b或break或q
        ;;
    [2-9])
        echo "你输入的是2-9"
        ;;
    test)
        echo "你输入的是test"
        ;;
    *)
        echo "请不要随便输入"
    esac
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

# FOR循环语法

# 一般写法

  • 将迭代对象赋值给变量进行循环,直到全部迭代完。

    # 格式
    for [变量名] in [迭代对象]
    do
        echo $变量
        ... ...
    done
    
    # 例子
    for $i in $(cat /etc/hosts);do
        echo $i
    done
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 取值方法

    # 从序列中取值
    for i in {01..09};do
        echo $i
    done
    
    # 从变量中取值
    test="test1 test2"
    for i in $test;do
        echo $i
    done
    
    
    # 从文件中取值(命令取值)
    for $i in $(cat /etc/hosts);do
        echo $i
    done
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
  • 自定义分隔符

    • for循环默认按空白符作为分隔符,也就是:空格、制表\t、换行\n、回车换行\r\n。
    # 我们可以通过修改IFS变量来自定义分隔符
    IFS="[分隔符]"
    
    # 例如:
    # 以冒号、分号、双引号分隔
    IFS=:;"
    # 以换行符分隔
    IFS=$'\n'
    
    1
    2
    3
    4
    5
    6
    7
    8

# C语言风格写法

  • 可以实现自增、自减的for循环,当然也可以自己写自增自减命令。

    # 格式
    for ((初始条件;判断条件;每次循环结束执行的操作))
    do
        ... ...
    done
    
    # 例子
    for ((a=1,b=9;a<10;a++,b-=1));do
        echo "$a and $b"
    done
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

# FOR循环并发执行

  • 将循环体的命令,使用{} &包起来即可,可防止串行循环的过程太长。

    # 使用例子
    for i in {1..50};do
        {
        echo $i
        } &
    done
    
    1
    2
    3
    4
    5
    6
  • 另外因为是同时执行,所以输出屏幕顺序可能会不一致。如果要在循环结束后,输出屏幕信息,需要添加wait命令,等待前台进程结束再往后执行。

# 流程控制语句

  • exit - 结束整个程序
  • break - 跳出当前循环
  • continue - 跳过本次循环,进入下次循环

# WHILE循环语法

  • 如果条件为真,则会一直循环,只有当条件为假或者break命令,才会跳出循环。

    # 格式
    while [条件]
    do
        循环体(命令)
    done
    
    # 例子
    i=10
    while [ $i -ge 0 ];do
        echo "$i"
        let i--
    done
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
  • 迭代文件内容

    # 格式
    while read [变量名]
    do
        循环体(命令)
    done<[文件路径]
    
    # 例子
    while read var
    do
        echo $var
    done</tmp/test.txt
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

# SHELL函数

# 函数介绍

  • 函数就是一堆命令的集合,来完成特定功能的代码块。
  • 定义函数相当于定义一个命令或则说脚本,并且可以在脚本中任何位置调用。
  • 使用函数可以使代码模块化,方便代码的复用,提高脚本的可读性。

# 定义Shell函数

  • 函数需要先定义,才能调用

    # 格式:另外关键字function可以省略
    function 函数名(){
        函数体(命令)
        ... ...
    }
    
    # 例子
    test(){
        echo "test"
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

# Shell函数传参

  • 位置传参

    # 函数的位置传参也同脚本一样,如$n、$#、$?等等。
    test(){
        echo "$1"
    }
    test "echo输出"
    
    # 脚本的位置参数和函数位置参数是隔离的,如果函数要使用脚本的位置参数,则需要传给函数才能调用
    test(){
        echo "$1"
    }
    test $1
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 变量传参

    # 脚本定义的变量,函数可以直接调用
    test(){ echo "$Num"; }
    Num=100
    test
    
    # 函数内定义的变量,调用函数后,脚本也可以调用
    test(){ Num=100; }
    test
    echo $Num
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

# 调用Shell函数

  • 直接像命令一样输入函数名即可,也可以将函数作为命令一样,获取屏幕输出给变量。

    # 调用test函数
    test
    
    # 调用test函数,并获取标准输出作为res变量的值
    res = $(test)
    
    1
    2
    3
    4
    5

# Shell函数返回值

  • 将函数的运行状态或结果返回到脚本。

  • 使用return返回值

    • return只能返回1-255的整数,调用return后函数会立即结束并返回结果,需要通过$?获取。
    • 通常用来供调用后获取函数执行状态:0表示成功,1表示失败。
    test(){
        return 0
    }
    test
    echo $?
    
    1
    2
    3
    4
    5
  • 使用echo返回值

    • 可以返回任何字符串结果,通常用来返回数据结果,如一个字符串或者列表值。

      test(){
          echo "test"
      }
      result=$(test)
      echo $result
      
      1
      2
      3
      4
      5
#Linux#Shell
Shell脚本介绍与变量
Shell脚本常见应用

← Shell脚本介绍与变量 Shell脚本常见应用→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式