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、[ ]、[[ ]] 三种写法。下一章集中讲比较和逻辑运算符。