下面的代码有什么问题?如何在shell脚本中删除文件名的扩展名?
3210就这样,我得到了字符串'$ filename | cut -f1 -d'。'但如果我删除引号,我什么都没有得到。同时打字
"test.exe" | cut -f1 -d'.'
在一个shell给我输出我想要的“测试”。我已经知道$ filename已被分配正确的值。我想要做的是将一个变量分配给没有扩展名的文件名。
下面的代码有什么问题?如何在shell脚本中删除文件名的扩展名?
3210就这样,我得到了字符串'$ filename | cut -f1 -d'。'但如果我删除引号,我什么都没有得到。同时打字
"test.exe" | cut -f1 -d'.'
在一个shell给我输出我想要的“测试”。我已经知道$ filename已被分配正确的值。我想要做的是将一个变量分配给没有扩展名的文件名。
当您想在脚本/命令中执行命令时,您应该使用$(command)。
所以,你的行会
name=$(echo $filename | cut -f 1 -d '.')
代码解释:
echo
得到变量$filename
的值,并将其发送到标准输出cut
指令cut
将使用。作为分隔符(也称为分离器),用于切割串入段,并通过-f
我们选择我们想在输出$()
包装将得到的输出并返回该细分市场的价值name
谢谢。我也注意到我需要使用echo命令。 name ='echo $ filename | cut -f1 -d'。'' – mimicocotopus
@mimicocotopus哦,是的,我忽略了那部分,谢谢。 – Rohan
反引号被POSIX弃用,'$()'是首选。 – jordanm
您还可以使用参数扩展:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
所述,这里是命令的解释:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html –
在这里我即将使用'echo -n“This.File.Has.Periods.In.It.txt”| awk -F。 “{$ NF = “”;打印$ 0}'| tr'''。' | rev | cut -c 2- | rev'。谢谢。 – user208145
如果您知道分机,你可以使用basename
$ 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
使用。在这里,我假定最后一个(点)后跟文本是扩展名。
两个问题与您的代码:
我会将您的代码更改为“name =`echo $ filename | cut -f 1 -d'。' `”,如下图所示(再次,注意反引号周围名称变量定义):
$> filename=foo.txt
$> echo $filename
foo.txt
$> name=`echo $filename | cut -f1 -d'.'`
$> echo $name
foo
$>
'基本名$文件名.exe'会做同样的事情。假设你总是知道你想要删除的扩展名。 – mpe
@mpe,你的意思是'basename“$ filename”.exe'。否则带空格的文件名将是个坏消息。 –