给出如下文件名:
/the/path/foo.txt
bar.txt
我希望得到:
foo
bar
为什么这行不通?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
正确的做法是什么?
给出如下文件名:
/the/path/foo.txt
bar.txt
我希望得到:
foo
bar
为什么这行不通?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
正确的做法是什么?
当前回答
您不必调用外部basename命令。相反,你可以使用以下命令:
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
注意,这个解决方案应该适用于所有最近(2004年以后)的POSIX兼容shell,(例如bash、dash、ksh等)。
2.6.2参数展开
关于bash字符串操作的更多信息:http://tldp.org/LDP/LG/issue18/bash.html
其他回答
只是一个替代方案,我提出了提取一个扩展,使用帖子在这个线程与我自己的小知识库,我更熟悉。
ext="$(rev <<< "$(cut -f "1" -d "." <<< "$(rev <<< "file.docx")")")"
注:请对我的引用提出建议;它对我有用,但我可能在正确使用上遗漏了一些东西(我可能用得太多了)。
下面是另一种(更复杂的)获取文件名或扩展名的方法,首先使用rev命令反转文件路径,从第一个开始切割。然后再次反转文件路径,就像这样:
filename=`rev <<< "$1" | cut -d"." -f2- | rev`
fileext=`rev <<< "$1" | cut -d"." -f1 | rev`
使用basename命令。它的手册页在这里:http://unixhelp.ed.ac.uk/CGI/man-cgi?basename
basename和cut的组合可以很好地工作,即使是在.tar.gz这样的双结尾的情况下:
fbname=$(basename "$fullfile" | cut -d. -f1)
如果这个解决方案比Bash参数扩展需要更少的算术能力,那将是有趣的。
以下是一些简单的句子:
(美元:" ${%。*}") $(basename "${s}" ".${s##*.}")
我需要这个,和bongbang和w4etwetewtwet问的一样。