如何在Bash脚本中从固定结构的工作目录路径提取指定变量内容
提取路径中Var1和Var2的Bash脚本方案
我来给你几个灵活的实现方案,完全不需要依赖/home/ubuntu/data/modelling这个可变前缀,完美适配你描述的固定路径结构:
方案一:字符串分割法(最简洁灵活)
利用Bash的字符串截取和数组分割,直接定位Iamvariable之后的内容,完全不关心前缀:
# 获取当前工作目录 current_dir=$(pwd) # 截取掉"Iamvariable/"之前的所有内容,得到后面的路径段 post_iam_path=${current_dir#*Iamvariable/} # 按斜杠分割成数组,利用固定结构直接提取目标值 IFS='/' read -r -a path_parts <<< "$post_iam_path" Var1=${path_parts[0]} # 第一个元素就是Var1 Var2=${path_parts[3]} # 第四个元素是Var2(因为中间固定是PRODUCTION/ANALYSIS) # 输出结果 echo "提取到的Var1: $Var1" echo "提取到的Var2: $Var2"
逻辑说明:
${current_dir#*Iamvariable/}是Bash的前缀删除语法,会删掉从路径开头到Iamvariable/的所有内容,留下Var1/PRODUCTION/ANALYSIS/Var2/DIHEDRALS- 用
IFS='/'把这段路径拆成数组,因为Iamvariable之后的结构完全固定,所以数组索引0对应Var1,索引3对应Var2,非常可靠。
方案二:正则匹配法(带格式校验)
如果需要确保路径严格符合预期结构,可以用正则表达式匹配,同时提取目标值:
current_dir=$(pwd) # 匹配固定结构的正则,捕获Var1和Var2 if [[ "$current_dir" =~ Iamvariable/([^/]+)/PRODUCTION/ANALYSIS/([^/]+)/DIHEDRALS ]]; then Var1=${BASH_REMATCH[1]} Var2=${BASH_REMATCH[2]} echo "Var1: $Var1" echo "Var2: $Var2" else echo "错误:当前路径不符合预期的结构,请检查路径是否正确" fi
逻辑说明:
- 正则中的
([^/]+)会匹配任意不含斜杠的字符串(也就是单个目录名) - 因为中间的
PRODUCTION和ANALYSIS是固定大写目录,所以直接写死在正则里,确保只有符合结构的路径才会被匹配,避免错误提取 - 如果路径不符合格式,会输出提示,增加脚本的鲁棒性。
方案三:逐层反向解析法(逻辑最直观)
如果你觉得字符串操作和正则有点抽象,可以用dirname和basename从当前目录逐层往上找,完全基于目录层级定位:
current_dir=$(pwd) # 提取Var2:当前目录的父目录就是Var2所在的目录 Var2=$(basename "$(dirname "$current_dir")") # 提取Var1:从当前目录往上数4层(DIHEDRALS → Var2 → ANALYSIS → PRODUCTION → Var1) var1_parent_dir=$(dirname "$(dirname "$(dirname "$(dirname "$current_dir")")")") Var1=$(basename "$var1_parent_dir") echo "Var1: $Var1" echo "Var2: $Var2"
逻辑说明:
dirname用来获取当前路径的父目录,basename用来获取路径的最后一段目录名- 按照固定的层级关系,从
DIHEDRALS(当前目录)往上1层是Var2,往上4层就是Var1所在的目录,取它的basename就是Var1。
方案选择建议
- 优先选方案一:代码简洁,完全不依赖前缀,执行效率高
- 如果需要路径格式校验,选方案二:能避免非法路径导致的错误提取
- 如果喜欢直观的目录操作逻辑,选方案三:容易理解和调试
内容的提问来源于stack exchange,提问作者David Schroeder
相关产品推荐
相关产品推荐

