Shell脚本-条件判断语法格式

一、前言

在 Linux 系统中,Shell 脚本是系统管理、自动化任务和运维工作中不可或缺的工具。而条件判断是 Shell 脚本中最核心的控制结构之一,它决定了程序的执行流程,让脚本具备"智能"判断能力。

本文将全面讲解 Shell 脚本中条件判断的语法格式 ,包括 test 命令、[ ][[ ]](( )) 四种常见形式,并结合实际示例帮助你掌握其使用方法和注意事项。

二、Shell 条件判断的四种语法格式

Shell 中有四种常用的条件判断写法,它们各有特点,适用于不同场景。

1. 使用 test 命令

test 是最基础的条件判断命令,语法如下:

bash 复制代码
test 表达式

示例:

bash 复制代码
#!/bin/bash
if test 10 -gt 5; then
    echo "10 大于 5"
fi

✅ 特点:兼容性好,适用于所有 POSIX 标准的 shell。

2. 使用 [ ](中括号)

这是 test 命令的等价写法,更常见于脚本中:

bash 复制代码
[ 表达式 ]

注意: 中括号与表达式之间必须有空格!

示例:

bash 复制代码
#!/bin/bash
num=20
if [ $num -eq 20 ]; then
    echo "数值相等"
fi

✅ 特点:简洁,广泛使用。

⚠️ 注意:[ ] 不支持正则表达式和通配符匹配。

3. 使用 [[ ]](双中括号)------ 推荐使用

[[ ]] 是 Bash 的扩展语法,功能更强大,支持字符串模式匹配、逻辑运算符 &&|| 等。

bash 复制代码
[[ 表达式 ]]

示例:

bash 复制代码
#!/bin/bash
name="alice"
if [[ $name == "alice" ]]; then
    echo "用户名正确"
fi

# 支持通配符
if [[ $name == a* ]]; then
    echo "名字以 a 开头"
fi

✅ 特点:

  • 支持 &&||! 逻辑运算符
  • 支持 ==!= 字符串匹配(支持通配符)
  • 不需要对变量加引号(但仍建议加)

⚠️ 注意:[[ ]] 仅在 Bash、Zsh 等现代 shell 中可用,不适用于 sh

4. 使用 (( ))(双小括号)------ 数值计算专用

(( )) 用于数值比较和算术运算,语法更接近 C 语言。

bash 复制代码
(( 表达式 ))

示例:

bash 复制代码
#!/bin/bash
a=10
b=5
if (( a > b )); then
    echo "a 大于 b"
fi

# 支持复合运算
if (( a > 5 && b < 10 )); then
    echo "条件成立"
fi

✅ 特点:

  • 专用于数值判断
  • 支持 >, <, >=, <=, ==, !=, &&, ||
  • 写法简洁,无需使用 -gt-lt 等参数

三、常用条件判断类型

1. 数值比较

运算符 含义 示例
-eq 等于 [ 5 -eq 5 ]
-ne 不等于 [ 5 -ne 3 ]
-gt 大于 [ 5 -gt 3 ]
-ge 大于等于 [ 5 -ge 5 ]
-lt 小于 [ 3 -lt 5 ]
-le 小于等于 [ 3 -le 5 ]

💡 使用 (( )) 时可用 >, <, == 等符号。

2. 字符串比较

运算符 含义 示例
=== 等于 [ "a" = "a" ]
!= 不等于 [ "a" != "b" ]
-z 字符串为空 [ -z "" ]
-n 字符串非空 [ -n "hello" ]

示例:

bash 复制代码
str=""
if [ -z "$str" ]; then
    echo "字符串为空"
fi

✅ 建议:字符串变量使用双引号包围,防止空值导致语法错误。

3. 文件测试

运算符 含义 示例
-f file 是否为普通文件 [ -f /etc/passwd ]
-d dir 是否为目录 [ -d /tmp ]
-e file 是否存在 [ -e /bin/bash ]
-r file 是否可读 [ -r file.txt ]
-w file 是否可写 [ -w file.txt ]
-x file 是否可执行 [ -x script.sh ]

示例:

bash 复制代码
if [ -f "/etc/hosts" ]; then
    echo "hosts 文件存在"
fi

四、逻辑运算符

运算符 说明 用法
&& 逻辑与 [[ 条件1 && 条件2 ]]
` `
! 逻辑非 [[ ! 条件 ]]

⚠️ 注意:

  • [ ] 中需使用 -a(与)、-o(或),不推荐使用。
  • 推荐使用 [[ ]] 配合 &&||,更清晰易读。

五、实战示例:判断文件是否存在并可读

bash 复制代码
#!/bin/bash
filename="data.txt"

if [[ -f "$filename" && -r "$filename" ]]; then
    echo "文件存在且可读,开始处理..."
    cat "$filename"
else
    echo "文件不存在或不可读!"
    exit 1
fi

六、常见错误与注意事项

错误 原因 解决方法
缺少空格 [ $var=5 ] 正确写法:[ $var = 5 ]
变量未加引号 $var 为空时报错 使用 "$var"
使用 [ ] 写复杂逻辑 不支持 &&、`
sh 中使用 [[ ]] 兼容性问题 改为 [ ] 或使用 bash 执行

七、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!