下面的代码有什么问题?

name='$filename | cut -f1 -d'.''

就像这样,我得到的字面值字符串$filename | cut -f1 -d'。',但如果我删除引号,我什么也得不到。与此同时,打字

"test.exe" | cut -f1 -d'.'

在shell中给出我想要的输出,test。我已经知道$filename已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。


当前回答

你也可以使用参数展开:

$ filename=foo.txt
$ echo "${filename%.*}"
foo

只是要注意,如果没有文件扩展名,它将进一步向后寻找点,例如。

如果文件名只是以点开始(例如。bashrc),它将删除整个文件名。 如果只在路径中有一个点(例如path。到/myfile或。/myfile),那么它将在路径内部进行修剪。

其他回答

如果你的文件名包含一个点(除了扩展名),那么使用这个:

echo $filename | rev | cut -f 2- -d '.' | rev
file1=/tmp/main.one.two.sh
t=$(basename "$file1")                        # output is main.one.two.sh
name=$(echo "$file1" | sed -e 's/\.[^.]*$//') # output is /tmp/main.one.two
name=$(echo "$t" | sed -e 's/\.[^.]*$//')     # output is main.one.two

你想用哪个就用哪个。这里我假设是最后一个。(点)后面跟着文本是扩展。

如果知道扩展名,可以使用basename

$ basename /home/jsmith/base.wiki .wiki
base
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}

输出:

/tmp/foo.bar.gz /tmp/foo.bar

注意,只有最后一个扩展被删除。

假设你的文件有。new扩展名

ls -1 | awk '{ print "mv "$1" `basename "$1" .new`"}' | sh

由于张贴后不显示特别报价,请参阅图片。