Shell脚本中Glob模式匹配以作业号开头的目录失败排查
问题原因及解决方法
原代码无法匹配到目标目录,核心原因是Shell的通配符(Glob)展开规则:
- 变量赋值阶段不会解析通配符:你把
${Jobnumber}_*直接拼进filepath变量时,Shell只会把这段内容当成普通字符串存储,不会自动去查找匹配的目录。通配符只有在直接作为命令参数时才会被解析展开。 - 未处理匹配结果的不确定性:就算通配符能展开,也可能出现多个目录匹配的情况,原代码没有做任何校验,容易出问题。
解决办法
推荐用数组来捕获匹配的目录,同时做错误校验,确保逻辑可靠:
basepath="/Volumes/JDRIVE/Jobs/" echo "job number?" read Jobnumber # 用数组获取所有符合条件的目录 job_dirs=( "${basepath}${Jobnumber}_"* ) # 检查匹配结果 if [ ${#job_dirs[@]} -eq 0 ]; then echo "找不到以${Jobnumber}_开头的目录" exit 1 elif [ ${#job_dirs[@]} -gt 1 ]; then echo "找到多个匹配目录:${job_dirs[*]}" exit 1 fi # 构建最终文件路径 filepath="${job_dirs[0]}/Definedfolders/Files/" echo "目标路径:$filepath"
补充说明
- 数组方法能安全处理目录名带空格的情况,比直接用命令替换更可靠。
- 必须加错误校验,避免因为匹配不到目录或匹配多个目录导致后续操作出错。
内容的提问来源于stack exchange,提问作者Digital Press
相关产品推荐
相关产品推荐

