Bash中如何检查符合特定命名规则的目录是否存在
解决Bash中检查特定规则目录是否存在的问题
你遇到的问题核心在于双引号把通配符*给转义成了字面量——当你写"~/pkg_*"时,Bash不会将*展开成匹配的目录名,而是直接检查是否存在一个字面名为~/pkg_*的目录,这显然不存在,所以无论实际有没有符合条件的目录,判断都会返回false。
下面给你几种可靠的实现方法:
方法1:利用数组+nullglob选项(推荐,可获取匹配目录)
这个方法不仅能判断是否存在,还能保存所有匹配的目录供后续使用:
# 开启nullglob选项:如果通配符没有匹配到任何内容,会展开为空字符串 shopt -s nullglob # 将所有匹配的目录存入数组 pkg_dirs=(~/pkg_*) # 检查数组长度是否大于0(即是否有匹配目录) if [ ${#pkg_dirs[@]} -gt 0 ]; then echo "找到符合条件的目录:${pkg_dirs[*]}" else echo "未找到任何以pkg_开头的目录" fi # 可选:关闭nullglob,恢复shell默认行为 shopt -u nullglob
方法2:使用compgen命令(简洁,无需修改shell选项)
compgen是Bash内置命令,专门用来生成补全候选,这里可以用来检查通配符是否有匹配:
if compgen -G "~/pkg_*" > /dev/null; then echo "存在符合条件的目录" else echo "不存在符合条件的目录" fi
-G选项让compgen按照文件名通配符来匹配,输出结果重定向到/dev/null是因为我们只关心命令的退出状态(0表示有匹配,1表示无匹配)。
方法3:直接展开通配符(注意边界情况)
如果你确定最多只有一个匹配的目录,或者能接受多个匹配时的报错,可以直接去掉双引号:
if [ -d ~/pkg_* ]; then echo "存在符合条件的目录" else echo "不存在符合条件的目录" fi
⚠️ 注意:如果有多个目录匹配~/pkg_*,[ -d ]会因为参数过多而报错;如果没有匹配,Bash会把~/pkg_*当作字面量,判断结果还是false,所以这种方法局限性较大,不推荐在通用场景使用。
内容的提问来源于stack exchange,提问作者Find Me In The Woods
相关产品推荐
相关产品推荐

