如何优雅实现带参数可返回布尔值的Bash函数并在复杂if语句中使用
首先你要先明确Bash的if语法核心规则:if本身会直接判断其后跟随的命令/函数的退出状态码,退出码为0判定为真,非0判定为假,[]本质是test命令,不是if的必要组成部分,完全不需要把自定义布尔函数塞到[]里执行。
第一步:修正自定义布尔函数写法
统一按Bash规则返回状态码:0代表真,1代表假,示例如下:
one() { if [ "$1" == "hello" ]; then return 0 fi return 1 }
第二步:直接用逻辑运算符连接函数调用
不需要用[]包裹,也不需要用-o/-a,直接用||表示逻辑或,&&表示逻辑与,写法非常简洁:
# 等价于你要的one hello为真 或 one goodbye为真的逻辑 if one hello || one goodbye; then echo "Well, that's weird." fi
你想要的多函数组合判断写法可以直接实现:
# 注意参数如果包含空格请加双引号包裹,避免解析异常 if myfunc1 "$somearg" && myfunc2 "$someotherarg"; then # 你的业务逻辑 fi
混合其他test判断的写法
如果需要同时判断函数状态和文件、变量等test规则,可以直接组合[]和函数调用:
# 同时满足:one hello返回真、/tmp/test文件存在、num变量值大于10 if one hello && [ -f /tmp/test ] && [ "$num" -gt 10 ]; then echo "所有条件都满足" fi
补充说明:POSIX标准已经明确不推荐在
[]中使用-a/-o做逻辑运算,容易和文件名通配符混淆产生不可预期的结果,用&&/||连接多个独立判断是官方推荐的最优写法。
内容的提问来源于stack exchange,提问作者Joseph Larson
相关产品推荐
相关产品推荐

