Shell脚本结构化命令详解:if-then、test、复合条件与高级判断
一、if-then 语句
在编程中,结构化命令是指能够对命令的执行流程施加逻辑控制的语句。最基本的结构化命令就是 if-then。
基本语法:
if command
then
commands
fi
fi 表示 if 语句块的结束。
核心原理:Bash Shell 的 if 语句并不是直接判断条件是否为真,而是运行 if 后面的命令,然后检查该命令的退出状态码:
如果状态码为 0(命令执行成功),则执行 then 后面的命令
如果状态码为 非0(命令执行失败),则跳过 then 后面的命令
这种设计意味着,任何命令都可以放在 if 后面——只要命令成功执行,then 部分就会运行。
简写形式(将 then 放在同一行):
if command; then
commands
fi
二、if-then-else 语句
当命令成功执行时执行一组操作,失败时执行另一组操作,就需要 if-then-else:
if command
then
commands # 命令成功时执行
else
commands # 命令失败时执行
fi
三、elif 多分支语句
当需要判断多个条件时,可以使用 elif 来扩展 else 部分,避免嵌套多层 if:
if command1
then
commands
elif command2
then
commands
elif command3
then
commands
fi
四、test 命令
if-then 只能判断命令的退出状态码,而 test 命令提供了测试不同条件的能力。当 test 中列出的条件成立时,test 返回退出状态码 0,if-then 就会执行 then 部分。
两种等价语法:
if test condition
then
commands
fi
或使用方括号(更常用):
if [ condition ]
then
commands
fi
注意:方括号与条件内容之间必须有空格。[ condition ] 正确,[condition] 错误。
test 命令可以判断三类条件:
注意:test 命令只能处理整数,不能用于浮点数比较。
字符串相等性:所有的标点和大小写情况都考虑在内
字符串顺序:大于号和小于号必须转义(/<);大小写字母排序与sort命令恰好相反
字符串大小:-n和-z可以检查一个变量是否含有数据。
测试Linux文件系统上文件和目录的状态。
五、复合条件测试
if-then 允许使用布尔逻辑组合多个测试条件:
AND(与) :[ condition1 ] && [ condition2 ] — 两个条件都满足时才返回 TRUE
OR(或) :[ condition1 ] || [ condition2 ] — 任一条件满足时返回 TRUE
示例:
六、双括号和双方括号
双括号 (( expression )) — 高级数学运算
test 命令只能做简单的整数比较,而双括号命令支持更多数学运算符,且不需要转义大于号和小于号。
if (( $num > 10 )); then
echo “num 大于 10”
fi
if (( $num % 2 == 0 )); then
echo “num 是偶数”
fi
双括号中支持的运算符包括:++、–、!、~、**(幂运算)、<<、>>、&、|、&&、|| 等。
双方括号 [[ expression ]] — 高级字符串比较
双方括号支持模式匹配(如通配符),且不需要转义大于号和小于号。
if [[ $str == “hello” ]]; then
echo “字符串是 hello”
fi
#使用通配符进行模式匹配
if [[ $str == h* ]]; then
echo “字符串以 h 开头”
fi
