条件判断 if

if 是最常用的条件判断语句。Shell 的 if 语法和其他语言类似,但条件表达式的写法有些特别。

基本语法

if [ 条件 ]; then
    # 条件为真时执行
fi

注意 then 可以换行写:

if [ 条件 ]
then
    # 条件为真时执行
fi

if-else

if [ 条件 ]; then
    # 条件为真
else
    # 条件为假
fi

示例:

AGE=18

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

if-elif-else

SCORE=85

if [ $SCORE -ge 90 ]; then
    echo "优秀"
elif [ $SCORE -ge 80 ]; then
    echo "良好"
elif [ $SCORE -ge 60 ]; then
    echo "及格"
else
    echo "不及格"
fi

条件表达式

Shell 的条件表达式有几种写法:

单括号 [ ]

最基本的形式,等同于 test 命令:

if [ $A -eq $B ]; then
    echo "相等"
fi

# 等同于
if test $A -eq $B; then
    echo "相等"
fi

注意点:

  • 括号两边必须有空格
  • 变量最好用双引号包裹,防止空值报错
# 错误:如果 VAR 为空,变成 [ -eq 10 ]
if [ $VAR -eq 10 ]; then

# 正确
if [ "$VAR" -eq 10 ]; then

双括号 [[ ]]

Bash 扩展的写法,功能更强:

if [[ $A -eq $B ]]; then
    echo "相等"
fi

优点:

  • 支持正则匹配
  • 支持 &&|| 逻辑运算
  • 变量不需要加引号
  • 支持模式匹配
# 正则匹配
if [[ $STR =~ ^[0-9]+$ ]]; then
    echo "是数字"
fi

# 模式匹配
if [[ $FILE == *.txt ]]; then
    echo "文本文件"
fi

# 逻辑运算
if [[ $A -gt 0 && $A -lt 10 ]]; then
    echo "A 在 0 到 10 之间"
fi

双小括号 (( ))

用于算术运算和比较:

A=10
B=20

if (( A < B )); then
    echo "A 小于 B"
fi

if (( A != 0 )); then
    echo "A 不为 0"
fi

优点:

  • 使用数学符号,更直观
  • 支持算术运算
if (( (A + B) > 20 )); then
    echo "和大于 20"
fi

数字比较

A=10
B=20

# 在 [ ] 中用字母操作符
if [ $A -eq $B ]; then echo "相等"; fi
if [ $A -ne $B ]; then echo "不相等"; fi
if [ $A -gt $B ]; then echo "大于"; fi
if [ $A -ge $B ]; then echo "大于等于"; fi
if [ $A -lt $B ]; then echo "小于"; fi
if [ $A -le $B ]; then echo "小于等于"; fi

# 在 (( )) 中用数学符号
if (( A == B )); then echo "相等"; fi
if (( A != B )); then echo "不相等"; fi
if (( A > B )); then echo "大于"; fi
if (( A >= B )); then echo "大于等于"; fi
if (( A < B )); then echo "小于"; fi
if (( A <= B )); then echo "小于等于"; fi

字符串比较

STR1="hello"
STR2="world"

# 相等
if [ "$STR1" = "$STR2" ]; then
    echo "相等"
fi

# 不相等
if [ "$STR1" != "$STR2" ]; then
    echo "不相等"
fi

# 为空
if [ -z "$STR" ]; then
    echo "字符串为空"
fi

# 非空
if [ -n "$STR" ]; then
    echo "字符串非空"
fi

文件测试

FILE="/etc/passwd"

# 文件存在
if [ -e "$FILE" ]; then
    echo "文件存在"
fi

# 是普通文件
if [ -f "$FILE" ]; then
    echo "是普通文件"
fi

# 是目录
if [ -d "$FILE" ]; then
    echo "是目录"
fi

# 可读
if [ -r "$FILE" ]; then
    echo "可读"
fi

# 可写
if [ -w "$FILE" ]; then
    echo "可写"
fi

# 可执行
if [ -x "$FILE" ]; then
    echo "可执行"
fi

逻辑运算

# 与
if [ $A -gt 0 ] && [ $A -lt 10 ]; then
    echo "A 在 0 到 10 之间"
fi

# 或
if [ $A -lt 0 ] || [ $A -gt 10 ]; then
    echo "A 不在 0 到 10 之间"
fi

# 非
if [ ! -f "$FILE" ]; then
    echo "文件不存在"
fi

嵌套 if

if [ $AGE -ge 18 ]; then
    if [ $AGE -ge 60 ]; then
        echo "老年人"
    else
        echo "成年人"
    fi
else
    echo "未成年人"
fi

简洁写法

单行写法:

[ $A -gt 0 ] && echo "正数"
[ -z "$STR" ] && echo "字符串为空"

三元运算符模拟:

AGE=20
[[ $AGE -ge 18 ]] && echo "成年" || echo "未成年"

小结

if 语句要点:

  1. [ ] 是基本形式,[[ ]] 功能更强
  2. 数字比较用 -eq-lt 等,或用 (( ))
  3. 字符串比较用 =!=
  4. 文件测试用 -f-d-e
  5. 变量最好用双引号包裹