如何在shell脚本中删除文件名的扩展名?

下面的代码有什么问题?

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

就这样,我得到了string'$ filename | 切-f1 -d'。 但如果我删除引号,我什么都没有得到。 同时打字

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

在一个shell给我我想要的输出,“testing”。 我已经知道$ filename已被分配正确的值。 我想要做的是分配一个variables的文件名没有扩展名。

当你想在脚本/命令中执行命令时,你应该使用$(command)。

所以你的路线是

 name=$(echo $filename | cut -f 1 -d '.') 

代码说明:

  1. echo获取variables$filename的值并将其发送到标准输出
  2. 然后我们抓取输出并将其输送到cut命令
  3. cut将使用。 作为分隔符(也称为分隔符),用于将string切分为多个分段,通过-fselect我们想要输出的分段
  4. 然后$()包装将得到输出并返回它的值
  5. 返回的值将被分配给名为name的variables

您也可以使用参数扩展:

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

如果您知道扩展名,您可以使用基本名称

 $ basename /home/jsmith/base.wiki .wiki base 

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

 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 

使用任何你想要的。 在这里,我假设最后一个(点)跟文本是扩展名。

你的代码有两个问题:

  1. 你使用了'(tick)'而不是'(back tick)'来包围产生你想要存储在variables中的string的命令。
  2. 你没有把variables“$ filename”“回显”到“cut”命令中。

我会改变你的代码为“name =`echo $ filename | cut -f 1 -d'。 `“,如下所示(同样,注意名称variables定义周围的后面的标记):

 $> filename=foo.txt $> echo $filename foo.txt $> name=`echo $filename | cut -f1 -d'.'` $> echo $name foo $>