如何在bash profile中自动导出指定目录下后缀为SUM.ext的文件路径?
错误写法原因分析
- 第一种写法
export SOS="$anadir"/"$obsdir"/"*SUM.ext":通配符*放在双引号内部时,Bash不会执行通配符展开,会直接把*作为文件名的一部分,自然找不到对应文件。 - 第二种写法
export SOS="$anadir"/"$obsdir"/ls -1 *SUM.ext``:ls命令默认在当前执行source操作的工作目录搜索文件,不会自动到$anadir/$obsdir目录下匹配,所以找不到目标文件。 - 第三种写法
sosname="${odfdir#/*SUM.ext}":这里用的是Bash参数展开的前缀删除语法,功能是删除变量值开头匹配指定模式的部分,完全不符合搜索匹配文件的需求,自然无法得到正确路径。
可行的自动匹配方案
方案1:带错误校验的数组匹配(推荐)
这种方案会对匹配结果做校验,避免匹配不到或者匹配到多个文件的异常情况,稳定性更高:
# 开启nullglob选项,避免无匹配时把通配符当成字面量 shopt -s nullglob # 把目标目录下匹配到的SUM.ext文件存到数组中 sum_files=("$anadir/$obsdir"/*SUM.ext) # 关闭nullglob,避免影响后续其他命令的执行 shopt -u nullglob # 校验匹配结果 if [[ ${#sum_files[@]} -eq 1 ]]; then # 匹配到唯一文件,导出变量 export SOS="${sum_files[0]}" elif [[ ${#sum_files[@]} -eq 0 ]]; then echo "错误:$anadir/$obsdir 目录下未找到任何后缀为SUM.ext的文件" >&2 else echo "错误:$anadir/$obsdir 目录下找到${#sum_files[@]}个匹配的SUM.ext文件,请手动确认" >&2 echo "匹配到的文件列表:${sum_files[*]}" >&2 fi
将上述代码替换掉你.bash_profile中原先导出SOS的行即可,后续每次修改完$obsdir的值后重新source .bash_profile,就会自动匹配对应目录下的SUM.ext文件,无需手动修改文件名。
方案2:极简find写法
如果你能确定每个$obsdir对应的目录下永远只有1个符合要求的SUM.ext文件,可以用更简短的find命令实现:
export SOS=$(find "$anadir/$obsdir" -maxdepth 1 -type f -name "*SUM.ext" | head -n 1)
参数说明:
-maxdepth 1:仅搜索目标目录本身,不递归搜索子目录-type f:仅匹配普通文件,排除同名目录head -n 1:取第一个匹配结果,避免多个匹配时变量值异常
内容的提问来源于stack exchange,提问作者Sara Krauss
相关产品推荐
相关产品推荐

