if 是最常用的条件判断语句。Shell 的 if 语法和其他语言类似,但条件表达式的写法有些特别。
if [ 条件 ]; then
# 条件为真时执行
fi
注意 then 可以换行写:
if [ 条件 ]
then
# 条件为真时执行
fi
if [ 条件 ]; then
# 条件为真
else
# 条件为假
fi
示例:
AGE=18
if [ $AGE -ge 18 ]; then
echo "成年人"
else
echo "未成年人"
fi
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 [ $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 语句要点:
[ ] 是基本形式,[[ ]] 功能更强-eq、-lt 等,或用 (( ))=、!=-f、-d、-e 等