Bash语句`echo ${full_path##*/}`的含义及能否与readlink单行联用
Bash
${##*/} 语法解释 这是Bash内置的**参数扩展(Parameter Expansion)**功能,不属于正则表达式,是Shell专属的字符串处理语法:
- 单个
#表示从字符串开头删除「最短匹配」的指定模式 - 两个
##表示从字符串开头删除「最长匹配」的指定模式 - 后面跟的
*/就是匹配的模式,含义是「任意字符+斜杠」的组合
举个实际示例:
# 定义带全路径的变量 file_path="/data/project/src/main.py" # 执行最长前缀匹配删除,移除到最后一个斜杠为止的所有前缀内容 echo ${file_path##*/} # 输出结果:main.py
这个写法的作用是快速提取全路径中的纯文件名部分,不需要额外调用basename命令,执行性能更好。
与
readlink搭配的方法 Bash的参数扩展只能直接作用于变量,不能直接套在命令替换(即$(命令)写法)的结果上,直接写${$(readlink -f test.txt)##*/}会触发语法错误。
如果要在同一行实现效果,有两种可行写法:
- 同一行内先把
readlink结果赋值给临时变量,再调用参数扩展,用分号分隔语句即可:# 示例:直接输出软链接真实路径的纯文件名 f=$(readlink -f ./softlink); echo ${f##*/} - 如果不想引入临时变量,可以把参数扩展逻辑放在子Shell中执行:
echo $(tmp=$(readlink -f ./softlink); echo ${tmp##*/})
内容的提问来源于stack exchange,提问作者anteastra
相关产品推荐
相关产品推荐

