Shell脚本使用AND逻辑检测多个命令是否存在时报错如何解决?
Shell多命令检测脚本错误原因说明
你编写的多命令检测代码存在两类问题:
- 语法错误:
[是Shell内置命令而非语法标记,它和后续参数、结尾的]必须用空格分隔。你写的[$(test ...)]没有加空格,Shell会将其识别为一个不存在的命令,直接抛出找不到命令的报错。 - 逻辑冗余错误:
test和[是功能完全等价的命令([仅要求最后一个参数必须是]),你把test的执行结果嵌套到[中判断完全没有必要,反而会因为test执行成功无输出,导致[ ]判断空值出现逻辑异常。
你之前单命令的写法能正常运行,是因为你直接使用了test命令做判断,没有加多余的[ ]也没有语法空格问题。
正确写法参考
方案1(最简洁高效):直接利用command -v的退出状态判断,不需要捕获命令输出
# >/dev/null 2>&1 作用是丢弃命令的正常输出和错误输出,避免终端打印多余内容 if command -v brew >/dev/null 2>&1 && command -v python >/dev/null 2>&1; then echo -e "This will work" fi
方案2:保留[ ]写法,直接判断command -v输出是否非空
# -n 参数用于判断字符串长度是否不为0 if [ -n "$(command -v brew)" ] && [ -n "$(command -v python)" ]; then echo -e "This will work" fi
内容的提问来源于stack exchange,提问作者jrock2004
相关产品推荐
相关产品推荐

