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
相关产品推荐
相关产品推荐

