Bash中if语句支持哪些合法的表达式与语法结构?
Bash if 语句合法语法结构与
!运算符的说明 关于!运算符的两层语法解释
你遇到的困惑本质是存在两个完全独立的!用法:
- 第一种是
test(即[ ])和[[ ]]内部的运算符,属于测试命令自身的内置参数,由测试命令内部处理逻辑反转测试结果。 - 第二种是Bash Shell原生语法级别的命令否定操作符,不属于任何具体命令,可以加在任意合法命令/命令列表的最前面,作用是反转整个命令/命令列表的退出状态码,这个特性和test命令无关,完全由Shell层直接处理。
所以你写! [ -z "non-empty" ]时,!是作用于整个[命令的执行结果,和写在[内部的!在简单场景下效果一致,但属于完全不同的语法层级。
if 语句支持的所有合法test-commands结构
if后面可以跟任意合法的Bash命令列表,只要最终能返回0/非0的退出状态码,都可以作为判断条件,常见的合法结构包括:
- 任意单个可执行命令/内置命令
示例:if grep "test" file.txt; then echo "匹配成功"; fi
直接以命令本身的退出状态作为判断依据。 test内置命令(即[ ]写法)
test命令内置了文件测试、字符串测试、数值测试等逻辑,也支持内部!、-a、-o等运算符。
示例:if [ -f ./test.txt ]; then echo "文件存在"; fi- 扩展条件测试
[[ ]]语法
Bash专属关键字,支持正则匹配、模式匹配,比test命令容错性更高,同样支持内部运算符。
示例:if [[ $str =~ ^[0-9]+$ ]]; then echo "是纯数字"; fi - 算术测试
(( ))语法
直接对算术表达式求值,表达式结果非0时返回退出状态0,否则返回1,写数值判断更直观。
示例:if (( a > 10 )); then echo "a大于10"; fi - 带
!前缀的任意上述结构!作用于整个后续命令的退出状态,反转后传给if判断。
示例:if ! cd /invalid/path; then echo "路径切换失败"; fi - 多命令组合(用
&&/||连接
以最后一个执行的命令的退出状态作为判断依据。
示例:if apt update && apt install -y nginx; then echo "nginx安装成功"; fi - 管道命令
以管道最后一个命令的退出状态作为判断依据,开启pipefail选项时会取管道中最后一个非0的退出状态。
示例:if ls /etc | grep -q "nginx"; then echo "nginx配置目录存在"; fi - 命令组/子shell
以整个命令组/子shell的退出状态作为判断依据。
示例:if (cd /tmp && rm -rf test.log); then echo "日志清理成功"; fi
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

