You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash新手求助:编写脚本提取路径最后斜杠后的文件名

嘿,作为Bash新手碰到这种字符串处理需求太正常啦!其实不用太纠结复杂正则,Bash本身就有好几种简单又高效的方法能搞定这个,我给你一一说明:

最推荐的两种简单方法(不用正则)

1. Bash参数扩展(内置功能,速度最快)

Bash的参数扩展语法里,${变量##模式} 表示从字符串开头删除最长匹配的模式。针对你的需求,我们可以用${1##*/}来提取最后一个斜杠后的内容:

filename="${1##*/}"

解释一下:*/ 匹配的是从开头到最后一个斜杠的所有内容(因为##是最长匹配),删掉这部分后剩下的就是你要的文件名啦。

2. 用basename命令(专门干这个的工具,最直观)

basename是Linux系统自带的命令,作用就是提取路径中的文件名,直接用就行:

filename=$(basename "$1")

这个方法对新手来说最容易理解,一看就知道是在拿文件名。


如果一定要用正则处理的话

要是你就是想了解正则的用法,Bash也支持正则匹配,用=~操作符就行:

if [[ "$1" =~ .*/(.*) ]]; then
    filename="${BASH_REMATCH[1]}"
fi

解释一下:

  • 正则表达式.*/(.*)里,.*匹配任意字符,\/匹配斜杠(需要转义),括号里的(.*)是捕获分组,用来提取最后一个斜杠后的所有内容。
  • 匹配成功后,BASH_REMATCH数组会保存匹配结果,BASH_REMATCH[1]就是第一个捕获分组的内容,也就是你要的文件名。

完整脚本示例

把这些方法整合到脚本里,还可以加上参数检查,避免用户忘记传参:

#!/bin/bash

# 检查是否传入了参数
if [ $# -eq 0 ]; then
    echo "请传入文件路径作为参数!比如:./test.sh /root/data/test/something.txt"
    exit 1
fi

# 方法1:参数扩展
filename="${1##*/}"
echo "方法1提取的文件名:$filename"

# 方法2:basename命令
filename=$(basename "$1")
echo "方法2提取的文件名:$filename"

# 方法3:正则匹配
if [[ "$1" =~ .*/(.*) ]]; then
    filename="${BASH_REMATCH[1]}"
    echo "方法3提取的文件名:$filename"
fi

小提醒

不管用哪种方法,记得给变量加上双引号(比如"$1"),这样即使文件名里有空格或者特殊字符,脚本也能正常处理哦!

内容的提问来源于stack exchange,提问作者JJ Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:09:27