Shell 编程之条件语句

发布于:2025-04-12 ⋅ 阅读:(33) ⋅ 点赞:(0)

目录

一、条件测试操作

1. 文件测试

2. 整数值比较

3. 字符串比较

4. 逻辑测试

二、if 条件语句

1.结构

(1)单分支 if 语句

流程:​编辑

(2)双分支 if 语句

流程:​编辑

(3)多分支 if 语句

2.应用示例

(1)单分支 if 语句应用

(2)双分支 if 语句应用

(3)多分支 if 语句应用

三、case 分支语句

1. 结构

流程图​编辑

2. 特点

3. 应用示例

(1)检查用户输入的字符类型

(2)编写系统服务脚本

四、总结

一、文件测试

二、整数值比较

三、字符串比较

四、逻辑组合

五、if 语句


一、条件测试操作

1. 文件测试

  • 命令格式test 操作符 文件路径    或    [ 操作符 文件路径 ]

  • 常用操作符

    操作符 作用 示例
    -e 文件/目录是否存在 [ -e /tmp/file ]
    -f 是否为普通文件 [ -f ~/data.txt ]
    -d 是否为目录 [ -d /var/log ]
    -r 是否可读 [ -r file ]
    -w 是否可写 [ -w file ]
    -x 是否可执行 [ -x script.sh ]
    -s 文件大小是否非空 [ -s log.txt ]
    -L 是否为符号链接 [ -L /usr/bin/python ]
  • 注意: 测试命令(执行完后面一般跟“ echo $?”判断测试结果)

                    [ ” 或 “ ]”之间至少用一个空格分隔

  • 分隔符 : "&&"表示”而且“的关系,前面命令成功后执行后面命令,一般结合 ”echo  ”

                        “||”表示“或者”,条件成立一个就可以   

2. 整数值比较

  • 语法[ 数值1 操作符 数值2 ] 或 (( 数值1 操作符 数值2 ))

  • 操作符

    操作符 作用 示例
    -eq 等于 [ $a -eq 10 ]
    -ne 不等于 [ $count -ne 0 ]
    -gt 大于 [ $num -gt 100 ]
    -ge 大于等于 [ $score -ge 60 ]
    -lt 小于 [ $age -lt 18 ]
    -le 小于等于 [ $size -le 1024 ]
  • 注意:仅支持整数比较,浮点数需借助 bc 命令。

      (( )) 是 Bash 的算术运算语法,可直接用 >< 等符号:

3. 字符串比较

  • 语法[ "字符串1" 操作符 "字符串2" ]

  • 操作符

    操作符 作用 示例
    = 字符串相等 [ "$str" = "hello" ]
    != 字符串不等   “!”为取反 [ "$mode" != "debug" ]
    -z 字符串长度为 0(空) [ -z "$input" ]
    -n 字符串长度非 0(非空) [ -n "$username" ]
  • 注意:双引号包裹(避免空值导致语法错误):

    [ "$var" = "value" ]  # 正确  
    [ $var = "value" ]    # 若 $var 为空,等价于 [ = "value" ],报错

4. 逻辑测试

语法:组合多个条件

逻辑符 作用 示例
-a 或 && 逻辑与(AND) [ 条件1 -a 条件2 ] 或 条件1 && 条件2
-o 或 || 逻辑或(OR) [ 条件1 -o 条件2 ] 或 条件1 || 条件2
! 逻辑否(NOT) [ ! -f file ]

注意:-a  、-o ,使用test测试时才用;"&&"表示”而且“的关系,前面命令成功后执行后面命令, 两个条件必须都满足,“||”表示“或者”,条件成立一个整个命令都成立,“!”指定条件不成立。以上满足后整个测试命令才会返回值为0.

二、if 条件语句

1.结构

(1)单分支 if 语句

格式:

if   条件测试操作  ;

then  
           命令虚列  
fi  

流程:
(2)双分支 if 语句

格式:

if  条件 ;
then 
   命令1 
else 
   命令2 
fi  

流程:
(3)多分支 if 语句

格式

if  条件1 ;
then 
   命令A 
elif  条件2 ;
then 
   命令B 
else 
   命令C 
fi  

流程:

2.应用示例

(1)单分支 if 语句应用

内存告警示例:

#!/bin/bash  
if [ $(free | awk '/Mem/{print $4}') -lt 524288 ];
 then  
    echo "内存不足500MB!" >&2  # 将告警信息输出到标准错误流  
fi  

注释

  • 通过free命令获取内存信息,awk过滤出可用内存值

  • -lt 524288判断剩余内存是否小于512MB(单位KB)

  • >&2确保告警信息显示在终端(即使脚本输出被重定向)

(2)双分支 if 语句应用

网络联通性测试示例:

#!/bin/bash

# 定义测试目标(可修改为其他 IP 或域名)
target="8.8.8.8"

# 执行 ping 测试(Linux 用法:-c 指定次数,-W 超时时间;Mac 用法:-c 和 -t)
ping -c 3 -i 0.2 -W 2 "$target" &> /dev/null

# 双分支判断
if [ $? -eq 0 ];
 then
    echo "✅ 网络连通正常:主机 [$target] 可达!"
else
    echo "❌ 网络连接失败:主机 [$target] 不可达!"
fi
  • ping 命令参数

    • -c 3:发送 3 个探测包(避免无限等待)。

    • -W 2:每次等待响应超时时间为 2 秒(Linux 参数)。

    • -i  0.2 :连通速度

    • &> /dev/null:黑洞文件,丢弃所有输出(只需判断成功与否,无需显示内容)。

  • 退出状态码 $?

    • $? -eq 0:表示 ping 命令执行成功(至少收到 1 个回复包)。

    • $? -ne 0:表示 ping 失败(超时或目标不可达)。

(3)多分支 if 语句应用

成绩分级示例:

#!/bin/bash

read -p "请输入成绩(0-100):" score  
if [ $score -ge 80 ] && [ $score -le 100] 
 then  
    echo "优秀"               # 80-100分  
elif [ $score -ge 60 ]; 
 then  
    echo "合格"               # 60-79分  
else  
    echo "不合格"             # 60分以下  
fi  

注释

  • -ge用于数值比较(大于等于)

  • 条件必须从高到低排列,避免逻辑错误(如先判断≥60会包含≥90的情况)

三、case 分支语句

1. 结构

case 变量 in  
模式1)  
    命令组1  
    ;;          # 双分号表示分支结束  
模式2|模式3)    # 多个模式用|分隔  
    命令组2  
    ;;  
*)              # 通配符匹配其他所有情况  
    默认命令组  
    ;;  
esac           # case倒写表示结构结束  

流程图

2. 特点

  • case行尾必须为单词“ in ”,每一模式必须以右括号 “ ”结束。
  • 双分号“ ;; ”表示命令序列的结束。
  • 模式字符串中:可以用方括号表示一个连续的范围,加“ [0-9] ”,还可以用竖杠符号“ | ”表示或,如“A|B”
  • 最后的“  *)“表示默认模式,其中的*相当于通配符。

3. 应用示例

(1)检查用户输入的字符类型
read -p "请输入一个字符:" char  
case $char in  
    [a-zA-Z])  
        echo "字母"  
        ;;  
    [0-9])  
        echo "数字"  
        ;;  
    *)       ##"*)"默认模式,匹配任意字符
        echo "其他字符"  
        ;;  
esac  

注意

  • 模式 [a-zA-Z] 匹配单个字母,严格匹配单个字符,输入多个字符时会触发*)分支,匹配失败。

(2)编写系统服务脚本
#!/bin/bash
case "$1" in  
    start)  
        echo "启动服务..."  
        if sleep 7200 &
      then     //在后台启动sleep进程
        echo  "OK"
        fi
        ;;  
    stop)  
        echo -n "停止服务..."  pkill "sleep" &> /dev/null
        echo "OK"   //停止sleep进程
        ;;  
    status)
        if pgrep "sleep" &>/dev/null
      then
        echo "服务已经启动"
      else
         echo "服务已经停止"
         fi
         ;;
    restart)  
        echo "重启服务..."  
        $0 stop
        $0 start
        ;;  
    *)  
        echo "用法:$0 {start|stop|restart}"  #提示正确参数
        exit 1       # 非正常退出 
        ;;  
esac  

注释

  • 通过$1获取执行参数,实现子命令功能,表示脚本的第一个参数

  • exit 1确保输入错误参数时脚本立即终止

四、总结

一、文件测试

-e 存在 | -f 普通文件 | -d 目录
-r 可读 | -w 可写 | -x 可执行 | -s 非空文件
⚠️ 必须空格:[ -e file ](√) [-efile](×)


二、整数值比较

-eq 等于 | -ne 不等于
-gt 大于 | -lt 小于 | -ge 大于等于 | -le 小于等于
✅ 快捷写法:(( $a > $b ))(不用空格,直接运算符)


三、字符串比较

= 相等 | != 不相等 | -z 空串 | -n 非空串
🚫 致命细节:

  1. [ "$s" = "abc" ](变量必须加引号)

  2. = 两侧必须有空格


四、逻辑组合

-a 与(AND) | -o 或(OR) | ! 非(NOT)
✅ 高级写法:
[[ $a > 0 && $b < 5 ]](双中括号可用&&/||)
🚫 禁止:[ $a -gt 0 && $b -lt 5 ](单中括号只能用 -a/-o)

总结速查表

测试类型 常用操作符 重点注意事项
文件测试 -e-f-d-r 检查路径是否存在、类型、权限
整数比较 -eq-gt-lt 仅支持整数,用 (( )) 可简化语法
字符串比较 =!=-z-n 变量必须加引号,避免空值错误
逻辑测试

&&,   || ,!-a-o`

区分 [ ] 内逻辑符与命令连接符

五、if 语句

1. 单分支

if [ 条件 ]; then 命令; fi  

示例
if [ -f log.txt ]; then rm log.txt; fi


2. 双分支

if [ 条件 ]; then  
  命令1  
else  
  命令2  
fi  

场景

if [ $? -eq 0 ]; then echo "成功"; else echo "失败"; fi  

3. 多分支

if [ 条件1 ]; then  
  命令A  
elif [ 条件2 ]; then  
  命令B  
else  
  命令C  
fi  

示例

if [ $age -lt 18 ]; then  
  echo "未成年"  
elif [ $age -lt 60 ]; then  
  echo "成年"  
else  
  echo "老年"  
fi  
结构 适用场景 优势
if 复杂条件判断(数值、文件、字符串) 灵活,支持任意条件逻辑
case 固定模式匹配(如选项、字符串分类) 简洁高效,可读性强

选择原则

  • 条件超过 3 种且为固定模式 → 优先用 case

  • 需要判断文件/数值/逻辑组合 → 用 if