我想得到一个变量的基名,它总是一个带扩展名的文件,扩展名被剥离并将其设置为变量。
例如,如果$ foo是/$HOME/Desktop/doc.txt,那么我希望变量$ mediaid为" doc"
mediaid=$(basename $foo | cut -d. -f1)
有效
但是
mediaid="$(${foo##*/} | cut -d. -f1)"
不
我得到我的报价/大括号/ $搞砸了,但我不确定在哪里或如何准确。
此外,是否有更多,更优雅的方式来编写此内容以避免将其汇总到cut
?
答案 0 :(得分:2)
使用删除模式的扩展:
basename="${foo##*/}"
basename_stripped="${basename%.*}"
%
导致从以下模式的foo
值的末尾开始删除最短匹配。 .*
是一个通配模式,匹配一个文字句点后跟任何内容。
##
导致从头开始删除以下模式的最长匹配,*/
匹配最后一个路径分隔符的所有内容。
扩展由shell执行,没有外部命令或子shell,因此它会更快。