如何在脚本中使用带通配符与变量的cd命令进入唯一匹配目录?
实现唯一匹配目录的cd命令通用方法
通用实现方案
方法一:数组校验法(推荐)
先把符合模式的目录路径存入数组,通过判断数组长度确保只有唯一匹配项,再执行cd操作。这种方式能处理无匹配、多匹配的异常情况,避免脚本报错:
# 将匹配的目录存入数组 dirs=(build_dir/target*/"$1"*) # 校验匹配结果 if [ ${#dirs[@]} -eq 0 ]; then echo "错误:未找到符合模式的目录" >&2 exit 1 elif [ ${#dirs[@]} -gt 1 ]; then echo "错误:找到多个匹配目录:${dirs[*]}" >&2 exit 1 fi # 进入唯一匹配的目录 cd "${dirs[0]}"
这种写法的优势是显式校验匹配数量,杜绝模糊匹配带来的意外问题,适合严谨的脚本场景。
方法二:配合nullglob优化(Bash 4.0+可用)
如果你的Bash版本在4.0及以上,可以开启nullglob选项,让无匹配时返回空值,避免数组中出现无效的模式字符串:
# 开启nullglob选项 shopt -s nullglob dirs=(build_dir/target*/"$1"*) # 用完后关闭,避免影响后续命令 shopt -u nullglob # 后续校验和cd逻辑与方法一完全一致
方法三:简化版(仅适用于确定唯一匹配的场景)
如果你能完全保证每次只有一个目录符合模式,也可以用命令替换快速实现,但这种方式没有校验逻辑,出错时难以排查:
cd "$(echo build_dir/target*/"$1"*)"
不推荐在生产环境脚本中使用这种写法,一旦出现多匹配情况,会把所有目录名拼接后传给cd,直接触发错误。
内容的提问来源于stack exchange,提问作者Artyom Gevorgyan
相关产品推荐
相关产品推荐

