如何在 shell 中构建条件逻辑

LinuxBeginner
立即练习

简介

在Linux系统管理和编程领域,理解 shell 脚本中的条件逻辑对于创建灵活且智能的脚本至关重要。本教程提供了在 shell 环境中构建条件语句的全面指南,帮助开发者和系统管理员编写更高效、强大的 shell 脚本。

Shell 条件基础

条件语句简介

在 shell 脚本编程中,条件语句是创建动态且智能脚本的基础。它们使你能够根据特定条件做出决策并控制程序的流程。

基本测试运算符

Shell 提供了几种使用测试运算符来评估条件的方法:

测试命令语法

编写条件测试主要有两种方式:

  1. 使用 test 命令:
test condition
  1. 使用方括号:
[ condition ]

比较运算符

运算符 描述 数值比较 字符串比较
-eq 等于 ×
-ne 不等于 ×
-gt 大于 ×
-lt 小于 ×
== 等于(字符串) ×
!= 不等于(字符串) ×

简单条件示例

以下是一个演示条件逻辑的基本示例:

#!/bin/bash

age=25

if [ $age -ge 18 ]; then
  echo "你是成年人"
else
  echo "你是未成年人"
fi

控制流可视化

graph TD A[开始] --> B{条件检查} B -->|真| C[执行真分支] B -->|假| D[执行假分支] C --> E[继续] D --> E

常见条件场景

  1. 检查文件是否存在
  2. 比较数值
  3. 验证字符串内容
  4. 检查命令执行状态

最佳实践

  • 始终在 [ ] 内部使用空格
  • 使用 -z 检查空字符串
  • 使用 -n 检查非空字符串
  • 使用 &&|| 测试复杂条件

LabEx 学习提示

在 LabEx 的交互式 Linux 环境中练习这些条件技术,以获得 shell 脚本编程的实践经验。

比较与逻辑

逻辑运算符概述

Shell 脚本提供了强大的逻辑运算符,可有效地组合和评估多个条件。

逻辑与和或运算符

逻辑与 (&&)

仅当前一个命令成功时,才执行下一个命令:

[ condition ] && command_if_true

逻辑或 (||)

当前一个命令失败时,执行下一个命令:

[ condition ] || command_if_false

复杂条件评估

组合多个条件

#!/bin/bash

age=25
name="John"

if [ $age -ge 18 ] && [ "$name" == "John" ]; then
  echo "名为 John 的成年人"
fi

逻辑运算符真值表

| 条件 1 | 运算符 | 条件 2 | 结果 |
| ------ | ------ | ------ | ---- | --- | --- |
| 真 | && | 真 | 真 |
| 真 | && | 假 | 假 |
| 假 | && | 真 | 假 |
| 假 | && | 假 | 假 |
| 真 | | | | 真 | 真 |
| 真 | | | | 假 | 真 |
| 假 | | | | 真 | 真 |
| 假 | | | | 假 | 假 |

嵌套条件流程

graph TD A[开始] --> B{第一个条件} B -->|真| C{第二个条件} B -->|假| G[退出] C -->|真| D[执行操作] C -->|假| G

高级条件检查

取反运算符 (!)

反转条件的结果:

if [! -f /path/to/file ]; then
  echo "文件不存在"
fi

比较类型

  1. 数值比较
  2. 字符串比较
  3. 文件测试条件

数值比较示例

#!/bin/bash

x=10
y=20

if [ $x -lt $y ]; then
  echo "x 小于 y"
fi

字符串比较示例

#!/bin/bash

input="Hello"

if [ "$input" == "Hello" ]; then
  echo "问候语匹配"
fi

LabEx 实践提示

在 LabEx 的 shell 环境中试验这些逻辑运算符,以掌握条件逻辑技术。

实际条件流程

综合条件结构

多条件处理

If-Elif-Else 语句
#!/bin/bash

score=85

if [ $score -ge 90 ]; then
  echo "成绩:A"
elif [ $score -ge 80 ]; then
  echo "成绩:B"
elif [ $score -ge 70 ]; then
  echo "成绩:C"
else
  echo "成绩:F"
fi

Case 语句用法

模式匹配场景

#!/bin/bash

read -p "输入一周中的某天:" day

case $day in
  Monday) echo "工作周开始" ;;
  Tuesday) echo "第二个工作日" ;;
  Wednesday) echo "一周中间" ;;
  Thursday) echo "快到周末了" ;;
  Friday) echo "周末快到了" ;;
  Saturday | Sunday)
    echo "周末!"
    ;;
  *) echo "无效的日期" ;;
esac

条件流程可视化

graph TD A[开始] --> B{第一个条件} B -->|真| C[操作 1] B -->|假| D{第二个条件} D -->|真| E[操作 2] D -->|假| F{第三个条件} F -->|真| G[操作 3] F -->|假| H[默认操作]

高级条件技术

输入验证脚本

#!/bin/bash

validate_input() {
  local input=$1

  if [[ -z "$input" ]]; then
    echo "错误:输入不能为空"
    return 1
  fi

  if [[! "$input" =~ ^[0-9]+$ ]]; then
    echo "错误:输入必须是数字"
    return 1
  fi

  return 0
}

read -p "输入一个数字:" user_input

if validate_input "$user_input"; then
  echo "有效输入:$user_input"
fi

条件操作类型

| 操作类型 | 描述 | 示例 |
| ---------- | ------------ | ------------------- | --- | --- |
| 数值检查 | 比较数字 | -eq, -gt, -lt |
| 字符串检查 | 比较字符串 | ==, != |
| 文件检查 | 测试文件属性 | -f, -d, -x |
| 逻辑检查 | 组合条件 | &&, | | |

带条件的错误处理

#!/bin/bash

backup_file() {
  local source=$1
  local destination=$2

  if [! -f "$source" ]; then
    echo "源文件不存在"
    return 1
  fi

  cp "$source" "$destination" || {
    echo "备份失败"
    return 1
  }

  echo "备份成功"
  return 0
}

backup_file "/etc/passwd" "/tmp/passwd.bak"

LabEx 学习策略

在 LabEx 的交互式 shell 环境中练习这些条件流程技术,以培养强大的脚本编写技能。

总结

通过掌握 Linux shell 脚本中的条件逻辑,开发者能够创建更具动态性和响应性的脚本,这些脚本可以根据系统条件、文件状态和变量比较做出明智的决策。本教程涵盖的技术为编写健壮且适应性强的 shell 脚本奠定了坚实的基础,这些脚本能够处理复杂的计算任务和系统交互。