Shell 脚本编程 02

Shell 脚本编程 02

条件测试

测试操作概述

Shell 脚本的智能化
  • 使 Shell 脚本获得识别能力
  • 为命令的执行提供最直接的识别依据
    • 文件或目录的读/写等状态
    • 数值的大小
    • 字符串是否匹配
    • 多条件组合
test 测试操作
  • 语法格式
    • test 表达式
    • [ 表达式 ]
    • help test 查阅帮助
  • 使用命令 echo $? 查看判断结果

常见的测试操作

判断表达式
格式说明
[ 表达式 ]true
[ !表达式 ]false
[ 表达式1 -a 表达式2 ]and
[ 表达式1 -o 表达式2 ]or
字符串比较
  • [ 操作符 字符串 ]

  • test 操作符 字符串

    格式说明
    -n非空(! -z
    -z为空
  • [ 字符串1 操作符 字符串2 ]

  • test 字符串1 操作符 字符串2

    格式说明
    ==相等
    !=不等
整数值比较
  • [ 整数值1 操作符 整数值2 ]

  • test 整数值1 操作符 整数值2

    选项说明
    -eqEQual
    -neNot Equal
    -geGreater than or Equal
    -gtGreater Than
    -leLess than or Equal
    -ltLess Than
文件状态测试
  • [ 操作符 文件或目录 ]

  • test 操作符 文件或目录

    格式说明
    -a-eExist
    -dDirectory
    -fFile
    -rRead(对 root 无效)
    -wWrite(对 root 无效)
    -xeXcute
    -s内容不为空
    -h-L符号链接
    -O所有
    -G组所有
  • [ 文件或目录 操作符 文件或目录 ]

  • test 文件或目录 操作符 文件或目录

    格式说明
    -ntNew Than
    -otOld Than
    -ef硬链接

组合多个条件

逻辑分隔操作
  • 主要用法:

    • 命令1 操作符 命令2 ...
    • [ 条件1 ] 操作符 [ 条件2 ]
    操作符含义
    &&给定条件必须都成立,整个测试结果才为真
    ||只要其中一个条件成立,则整个测试结果为真
条件组合应用
  • 当前用户为 root,且位于 /root 目录下

    [ $USER == "root" ] && [ $PWD == "/root" ]
    [ $? -eq 0 ] && echo YES
    
  • /opt/testdir 目录不存在时,创建该目录

    [ -d "/opt/testdir" ] || mkdir -p /opt/testdir
    ls -ld /opt/testdir/
    

If 选择结构

单分支结构

  • 语法及格式

    • 当“条件成立”时执行命令序列
    • 否则,不执行任何操作
    if [ 条件 ];then
        # 命令序列
    fi
    
  • 流程示意图

    true
    false
    ...
    if 条件测试
    命令序列
    fi 结束判断
    ...
  • 示例

    • 判断挂载点目录,若不存在则创建
    #!/bin/bash
    MOUNT_DIR="/media/cdrom"
    if[!-d $MOUNT_DIR]
    then
        mkdir -p $MOUNT_DIR
    fi
    

双分支结构

  • 语法及格式

    • 当“条件成立”时执行命令序列1
    • 否则,执行命令序列2
    if [ 条件 ];then
        # 命令序列1
    else
        # 命令序列2
    fi
    
  • 流程示意图

    true
    false
    ...
    if 条件测试
    命令序列1
    命令序列2
    fi 结束判断
    ...
  • 示例

    • 检测并判断指定的主机是否可 ping 通
    • 目标主机的地址以位置参数提供
    #!/bin/bash
    read -p "请输入要测试的ip:" ip
    ping -c 3 -i 0.2 -W 1 $ip &>/dev/null
    if [ $? -eq 0 ];then
        echo 通了!
    else
        echo 不通!
    fi
    

多分支结构

  • 语法及格式

    • 相当于 if 语句嵌套
    • 针对多个条件分别执行不同的操作
    if [ 条件 ];then
        # 命令序列1
    elif [ 条件 ];then
        # 命令序列2
    
    ...
    
    else
        # 命令序列n
    fi
    
  • 流程示意图

    true
    false
    true
    true
    false
    ...
    if 条件测试1
    命令序列1
    if 条件测试2
    命令序列2
    else
    命令序列n
    fi 结束判断
    ...
    ...
    命令序列n-1
  • 示例

    • 输入一个分数,判断成绩分档
    • 85~100 优秀、70~84 良好、低于 70 不及格
    #!/bin/bash
    if [ -n $1 ];then
        sc=$1
    else
        read -p "请输入分数(0-100):" sc
    fi
    
    if [ $sc -gt 100 -o $sc -lt 0 ];then
        echo 格式错误!
    elif [ $sc -ge 85 ];then
        echo 优秀
    elif [ $sc -ge 70 ];then
        echo 良好
    else
        echo 不及格
    fi
    

循环结构

for 循环

  • 遍历/列表式循环

    • 根据变量的不同取值,重复执行命令序列
    for 变量 in 列表
    do
        # 命令序列
    done
    
  • 流程示意图

    ...
    for 变量=取值1
    do 命令序列
    取值1\n取值2\n...\n取值n
    done 结束循环
    ...
  • 示例

    • 批量添加用户帐号(名称无规律)
    #!/bin/bash
    ULIST=$(cat /root/users.txt)
    for UNAME in $ULIST
    do
        useradd $UNAME
        echo "123" | passwd --stdin $UNAME
    done
    
  • C 语言风格的 for 循环

    • 通过变量控制,条件成立时循环
    • 步长可控制
    for ((初值;条件;步长控制))
    do
        # 命令序列
    done
    
生成列表方式
  1. 1 2 3 4 a b c
  2. {1,2,4,5} {1..100} 只能是常量
  3. seq 100 1 到 100

while 循环

  • 条件式循环

    • 反复测试条件,只要成立就执行命令序列
    while 条件
    do
        # 命令序列
    done
    
  • l流程示意图

    条件成立
    条件不成立
    ...
    while 条件测试
    do 命令序列
    done 结束循环
    ...
  • 示例

    • 批量添加用户(名称有规律)
    #!/bin/bash
    PREFIX="tuser";i=1
    while [ $i -le 5 ]
    do
        useradd ${PREFIX}$i
        echo 123 | passwd --stdin ${PREFIX}$i &>/dev/null
        let i++
    done
    
  • 需要长时间运行的循环,循环体中加上 sheep 时间 可以减轻 CPU 压力

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值