shell编程之条件语句

目录

一:条件测试操作

基本语法形式

test 命令

1.文件测试

2.字符串比较

3.数值比较

4.逻辑测试

二:if条件语句

1.单分支if语句

基本语法

实例:

2.双分支if语句

基本语法

3.多分支if语句

基本语法

‌基本结构‌

总结


前言

在Shell脚本编程中,条件语句是控制脚本逻辑的核心工具之一。无论是自动化任务、系统管理还是数据处理,脚本的“智能”往往体现在它能否根据不同的场景动态调整行为——比如检查文件是否存在、判断命令执行结果、比较数值或字符串,或是处理用户输入的分支选择。这些决策过程都离不开条件语句的灵活运用。

Shell提供了丰富的条件判断语法,从经典的 if-then-else 结构到简洁高效的 case 语句,再到与测试命令(test[ ])及现代Shell扩展(如 [[ ]] 双括号)的深度结合,条件语句的合理使用能显著提升脚本的健壮性和可读性。然而,Shell的语法细节(如空格敏感、运算符差异等)也常成为初学者的挑战,稍有不慎便可能导致逻辑错误或意外行为。

本章将深入探讨Shell条件语句的核心机制,涵盖基础语法、常见用例、实用技巧以及避坑指南。通过理解这些内容,您将能够编写出更加高效、可靠且易于维护的Shell脚本,从容应对复杂场景下的逻辑控制需求。

一:条件测试操作

在 Shell 脚本编程中,条件测试操作是逻辑控制的基础,用于判断某个条件是否成立,从而决定程序的执行流程。Shell 提供了多种条件测试语法和操作符,主要通过 test 命令或其等价形式 [ ](方括号)或 [[ ]](双括号,Bash 扩展)来实现。以下是条件测试的核心内容:

基本语法形式

test 命令

直接使用 test 命令进行条件判断,语法为:

 test 条件表达式

1.文件测试

用于检查文件或目录的状态:

  • -e FILE:文件/目录是否存在

  • -f FILE:是否为普通文件

  • -d FILE:是否为目录

  • -r FILE:是否可读

  • -w FILE:是否可写

  • -x FILE:是否可执行

  • -s FILE:文件大小是否非空

  • -L FILE:是否为符号链接

 #执行条件测试操作后,可通过变量$?查看返回值状态,从而判断是否成立
 [root@localhost ~]# fdisk -l
 [root@localhost ~]# echo $?
 0       #返回值为0表示条件成立,若条件不成立,则表示为1           
 ​

2.字符串比较

用于比较字符串内容:

  • -z STRING:字符串是否为空(长度为 0)

  • -n STRING:字符串是否非空(长度不为 0)

  • STRING1 = STRING2:字符串是否相等

  • STRING1 != STRING2:字符串是否不等

  • STRING1 < STRING2:字符串按字典序是否小于

  • STRING1 > STRING2:字符串按字典序是否大于

 if [ "$name" = "admin" ]; then
     echo "Welcome admin"
 fi

3.数值比较

用于比较整数:

  • NUM1 -eq NUM2:等于(Equal)

  • NUM1 -ne NUM2:不等于(Not Equal)

  • NUM1 -lt NUM2:小于(Less Than)

  • NUM1 -le NUM2:小于等于(Less or Equal)

  • NUM1 -gt NUM2:大于(Greater Than)

  • NUM1 -ge NUM2:大于等于(Greater or Equal)

 if [ $age -ge 18 ]; then
     echo "Adult"
 fi

4.逻辑测试

通过逻辑操作符组合多个条件:

  • !:逻辑非

  • -a:逻辑与(在 [ ] 中使用)

  • -o:逻辑或(在 [ ] 中使用)

  • &&:逻辑与(在 [[ ]] 或命令链中使用)

  • ||:逻辑或(在 [[ ]] 或命令链中使用)

 if [[ -f file.txt && -r file.txt ]]; then
     echo "File exists and is readable"
 fi

二:if条件语句

在 Shell 脚本中,if 条件语句是实现逻辑分支的核心结构,用于根据条件表达式的真假执行不同的代码块。其语法灵活且功能强大,支持单分支、多分支以及嵌套逻辑。以下是 if 语句的详细解析:

1.单分支if语句

在 Shell 脚本编程中,单分支 if 语句是最基础的条件控制结构,用于在满足特定条件时执行一组操作,否则直接跳过该代码块。其核心特点是仅处理条件成立的情况,不包含 elseelif 分支。以下是单分支 if 语句的详细说明:

基本语法
 if [ 条件表达式 ]; then
     # 条件为真时执行的代码
 fi
  • if:关键字,表示条件语句的开始。

  • [ 条件表达式 ]:使用 test 命令或其等价形式 [ ][[ ]] 包裹的条件判断。

  • then:关键字,标志条件成立后要执行的代码块开始。

  • fi:关键字(if 的倒写),表示 if 语句结束。

实例:
 #!/bin/bash
 ​
 # 获取内存使用率(以百分比形式)
 memory_usage=$(free | awk '/Mem/{printf "%.0f", $3/$2*100}')
 ​
 # 单分支判断
 if [ "$memory_usage" -gt 90 ]; then
     echo "警告:内存使用率已达 ${memory_usage}%!" | mail -s "内存告警" admin@example.com
 fi

2.双分支if语句

双分支if语句是Shell脚本中最常用的条件控制结构之一,它允许程序根据条件判断的结果执行不同的代码块。与单分支if语句不同,双分支if语句会明确处理条件成立和不成立两种情况。

基本语法
 if [ 条件表达式 ]; then
     # 条件为真时执行的代码块
 else
     # 条件为假时执行的代码块
 fi
  • if:关键字,表示条件语句的开始。

  • [ 条件表达式 ]:使用 test 命令或其等价形式 [ ][[ ]] 包裹的条件判断。

  • then:关键字,标志条件成立后要执行的代码块开始。

  • else:关键字,标志条件不成立后要执行的代码块开始。

  • fi:关键字(if 的倒写),表示 if 语句结束。

实例:

 #创建一个脚本,通过位置参数$1提供目标主机地址,根据ping命令得到相应的提示
 [root@localhost ~]# vim aaa.sh
 #!/bin/bash
 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
 if [ $? -eq 0 ]
 then
     echo "host $1 up"
 else
     echo "host $1 down"
 fi
 [root@localhost ~]# ./aaa.sh 127.0.0.1
 host 127.0.0.1 up
 [root@localhost ~]# ./aaa.sh 12.0.0.1
 host 12.0.0.1 down
 ​

3.多分支if语句

在 Shell 脚本编程中,多分支 if 语句(即 if-elif-else 结构)用于处理多个互斥条件的判断场景,允许脚本根据不同的条件执行对应的代码块。相较于单分支和双分支结构,多分支 if 语句能更高效地处理复杂的逻辑分支。

基本语法
 if [ 条件1 ]; then
     # 条件1成立时执行
 elif [ 条件2 ]; then
     # 条件2成立时执行
 elif [ 条件3 ]; then
     # 条件3成立时执行
 else
     # 所有条件均不成立时执行
 fi
  • if:起始条件判断。

  • elifelse if 的缩写):用于添加多个额外条件分支。

  • else:兜底分支(可选)。

  • fi:结束标记。

实例:

 #!/bin/bash
 ​
 # 获取1分钟平均负载(浮点数转整数)
 load=$(uptime | awk -F 'load average: ' '{print $2}' | cut -d, -f1 | awk '{printf "%d", $1}')
 ​
 if [ $load -gt 10 ]; then
     echo "[严重] 系统负载过高: $load" | mail -s "紧急告警" admin@example.com
     systemctl restart critical-service
 elif [ $load -gt 5 ]; then
     echo "[警告] 系统负载较高: $load" | mail -s "负载警告" admin@example.com
 elif [ $load -gt 2 ]; then
     echo "[注意] 系统负载中等: $load"
 else
     echo "[正常] 系统负载良好: $load"
 fi

三:case分支语句

Case 分支语句(或称为 ‌Switch 语句‌)是一种条件控制结构,用于根据不同的条件值执行不同的代码分支。它类似于 if-else 链,但语法更简洁,尤其适合处理‌多条件的分支判断‌。

Case 分支语句(或称为 ‌Switch 语句‌)是一种条件控制结构,用于根据不同的条件值执行不同的代码分支。它类似于 if-else 链,但语法更简洁,尤其适合处理‌多条件的分支判断‌。


基本结构

不同编程语言中语法略有差异,但核心逻辑类似:

 case [ 条件表达式 ] in
     值1: 执行代码块1
     值2: 执行代码块2
     ...
     else: 默认执行代码块
 esac
  • case:关键字,表示条件语句的开始。

  • [ 条件表达式 ]:使用 test 命令或其等价形式 [ ][[ ]] 包裹的条件判断。

  • else:关键字,标志条件成立后要执行的代码块开始。

  • esac:关键字(case 的倒写),表示 case 语句结束

实例:

 
[root@localhost ~]# vim ccc.sh
 #!/bin/bash
 read -p "请输入一个字符,并按Enter键确认:" KEY
 case "$KEY" in
 [a-z]|[A-Z])
         echo "您输入的是 字母."
         ;;
 [0-9])
     echo "您输入的是 数字."
     ;;
     *)
         echo "您输入的是 空格、功能键或者其他控制字符."
     esac
 #验证 
 [root@localhost ~]# ./ccc.sh a
 请输入一个字符,并按Enter键确认:a
 您输入的是 字母.
 [root@localhost ~]# ./ccc.sh 
 请输入一个字符,并按Enter键确认:1
 您输入的是 数字.
 [root@localhost ~]# ./ccc.sh 
 请输入一个字符,并按Enter键确认:.
 您输入的是 空格、功能键或者其他控制字符.
 ​

总结

条件语句是Shell脚本逻辑控制的核心工具:

  • 条件测试是基础,灵活使用文件、字符串、数值和逻辑操作符。

  • if语句适合层级化逻辑,覆盖单分支到多分支场景。

  • case语句简化多值匹配,提升代码简洁性。

  • 细节决定成败:注意语法格式、变量防护和测试方式的选择,避免常见错误。

通过合理运用条件语句,可显著增强脚本的健壮性和可维护性,轻松应对复杂自动化任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值