如何在Bash中提取路径最后两个斜杠间的字符串?
提取Bash路径中倒数第二个目录的多种方法
你提到的${${path%/*}##*/}无效是因为Bash不支持嵌套的参数扩展——没法在一个${}里直接嵌套另一个参数替换,必须拆分步骤。除了你已经找到的临时变量方法,这里还有几个实用的替代方案:
方法1:结合dirname和basename(最直观)
这两个是Bash处理路径的原生命令,组合起来逻辑清晰,还能自动处理带空格的路径:
path="/dir0/dir1/dir2/filename.ext" cut=$(basename "$(dirname "$path")") echo "$cut" # 输出 dir2
dirname "$path"会返回/dir0/dir1/dir2(去掉最后一层的文件名/空)- 再用
basename提取这个结果的最后一层目录,就是我们要的dir2
方法2:数组分割法(灵活处理特殊路径)
把路径按/拆成数组,从后往前找第一个非空元素,它的前一个就是目标目录——能兼容路径结尾带/的情况(比如/dir0/dir1/dir2/):
path="/dir0/dir1/dir2/filename.ext" IFS='/' read -ra parts <<< "$path" # 从数组末尾往前遍历,找第一个非空元素 for ((i=${#parts[@]}-1; i>=0; i--)); do if [[ -n ${parts[i]} ]]; then cut=${parts[i-1]} break fi done echo "$cut" # 输出 dir2
方法3:正则表达式匹配(精准捕获)
利用Bash的=~正则匹配功能,直接捕获倒数第二个目录:
path="/dir0/dir1/dir2/filename.ext" # 正则适配两种情况:带文件名、结尾带/ if [[ $path =~ ^.*/([^/]+)/[^/]*$ ]]; then cut=${BASH_REMATCH[1]} echo "$cut" # 输出 dir2 fi
正则逻辑:匹配任意前缀,然后捕获一组不包含/的字符(目标目录),最后匹配任意非/的结尾(文件名或空)。
方法4:用rev反转字符串处理(简洁一行)
通过反转字符串把“倒数第二个目录”变成“第二个字段”,处理完再反转回来:
path="/dir0/dir1/dir2/filename.ext" cut=$(echo "$path" | rev | cut -d'/' -f2 | rev) echo "$cut" # 输出 dir2
注意:如果路径结尾带/,可以先去掉结尾的/再处理,比如:
path="/dir0/dir1/dir2/" cut=$(echo "${path%/}" | rev | cut -d'/' -f2 | rev) echo "$cut" # 依然输出 dir2
方法5:Awk一行处理(兼容所有路径场景)
用Awk按/分割后,从后往前找第一个非空字段,输出它的前一个字段:
path="/dir0/dir1/dir2/filename.ext" cut=$(echo "$path" | awk -F'/' '{for(i=NF;i>0;i--) if($i!="") {print $(i-1); exit}}') echo "$cut" # 输出 dir2
这个方法不用额外处理结尾的/,Awk会自动跳过空字段。
内容的提问来源于stack exchange,提问作者Nisba
相关产品推荐
相关产品推荐

