首页 / Linux 命令行入门教程 / 85. if 条件结构与 test / [ ] / [[ ]]

Linux 命令行入门教程

85. if 条件结构与 test / [ ] / [[ ]]

本教程共 90 篇 · 第 85 篇

85. if 条件结构与 test / [ ] / [[ ]]

脚本要”看情况办事”,靠 if。条件成立就执行一段,不成立就走另一段。

if 的基本样子

if [ 条件 ]; then
  echo "条件成立"
else
  echo "条件不成立"
fi

if 开头,then 后面写成立时要做的,else 是可选的分支,fi 收尾(把 if 反过来写)。多分支用 elif

#!/bin/bash
read -p "输入分数:" score
if [ "$score" -ge 90 ]; then
  echo "优秀"
elif [ "$score" -ge 60 ]; then
  echo "及格"
else
  echo "不及格"
fi

条件的三种写法

中括号其实是命令,不是语法糖。下面三种等价,都是”测试”:

test -f file.txt        # 写法一:test 命令
[ -f file.txt ]         # 写法二:用 [ ],注意括号内外留空格
[[ -f file.txt ]]       # 写法三:bash 专属 [[ ]]

[ ] 兼容性最好,sh 也能用。[[ ]] 是 bash 增强版,支持正则、&&/|| 直接写,不容易出错。本教程以 bash 为准,推荐用 [[ ]]

Tip

[] 前后一定要留空格!写成 [-f file] 会被当成一条命令名,直接报错。这是新手最常踩的坑。

测试什么

方括号里放”测试表达式”,常见几类(下一章展开运算符):

[ -f file.txt ]   # 是不是普通文件
[ -d /tmp ]       # 是不是目录
[ -z "$var" ]     # 变量是否为空
[ "$a" = "$b" ]   # 两个字符串是否相等
Note

-ge-gt 这类是整数比较,括号里的值必须真的是数字。让用户输入分数再比较时,记得先确认输入的是数字,否则非数字会报”integer expression expected”错。

实战小例

判断文件是否存在再操作:

#!/bin/bash
file="$1"
if [ -z "$file" ]; then
  echo "用法:$0 文件名"
  exit 1
fi
if [ -f "$file" ]; then
  echo "$file 存在"
else
  echo "$file 不存在"
fi

条件外还能接 &&(成立才执行)和 ||(不成立才执行),写单行判断很方便:

[ -d "$1" ] && echo "是目录" || echo "不是目录"

小结:if/then/else/fi 是分支骨架,条件用 test[ ][[ ]] 三种写法。下一章集中讲比较和逻辑运算符。