如何在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 '.')
代码说明:
-
echo
获取variables$filename
的值并将其发送到标准输出 - 然后我们抓取输出并将其输送到
cut
命令 -
cut
将使用。 作为分隔符(也称为分隔符),用于将string切分为多个分段,通过-f
select我们想要输出的分段 - 然后
$()
包装将得到输出并返回它的值 - 返回的值将被分配给名为
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
使用任何你想要的。 在这里,我假设最后一个(点)跟文本是扩展名。
你的代码有两个问题:
- 你使用了'(tick)'而不是'(back tick)'来包围产生你想要存储在variables中的string的命令。
- 你没有把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 $>