有什么不对下面的代码?
name='$filename | cut -f1 -d'.''
由于是,我得到的文本字符串$filename | cut -f1 -d'.'
$filename | cut -f1 -d'.'
,但如果我删除引号我没有得到任何东西。 同时打字
"test.exe" | cut -f1 -d'.'
在shell给我输出我想要的, test
。 我已经知道$filename
已经分配了正确的价值。 我想要做的就是分配给一个变量名不带扩展名。
你应该使用命令替换语法$(command)
当你想在脚本/命令来执行命令。
所以,你的行会
name=$(echo "$filename" | cut -f 1 -d '.')
代码解释:
-
echo
得到变量的值$filename
,并将其发送到标准输出 - 然后,我们抢输出和管道它的
cut
命令 - 该
cut
将使用。 作为分隔符(也称为分离器),用于切割串入段和由-f
我们选择哪个段我们希望在输出 - 然后
$()
命令替换将得到的输出,并返回其值 - 返回的值将被分配给变量命名的
name
请注意,这给该变量的部分达第一时间段.
:
$ filename=hello.world
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d '.'
hello
您还可以使用参数扩展:
$ 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
无论你想要使用。 在这里,我认为最后.
(点),其次是文字的延伸。
作为chepner答案的评论所指出的Hawker65,最投票的解决方案既没有照顾多个扩展名(如文件名.tar.gz),也没有在路径的其余部分点(如this.path的/有.dots / in.path.name)。 一种可能的解决办法是:
a=this.path/with.dots/in.path.name/filename.tar.gz
echo $(dirname $a)/$(basename $a | cut -d. -f1)
有两个问题与您的代码:
- 您使用了“(打勾)而不是'(反勾)包围产生要在变量存储字符串命令。
- 你没有“回声”变量“$文件名”的管进入“切割”命令。
我会改变你的代码为“NAME =`回声$文件名|切-f 1 -d‘’ `”,如下所示(再次注意背面蜱周围的名称变量定义):
$> filename=foo.txt
$> echo $filename
foo.txt
$> name=`echo $filename | cut -f1 -d'.'`
$> echo $name
foo
$>
#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"
输出:
program
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}
输出:
/tmp/foo.bar.gz /tmp/foo.bar
请注意,只有最后一次延长被删除。
我的建议是使用基名。
这是在默认情况下在Ubuntu中,视觉上简单的代码和处理大多数情况下。 下面是一些子情况来处理空间和multidot /副延伸:
pathfile = “../空间FLD /空间-file.tar.gz”
回声$ {// pathfile +(/ |)}
通常它也会从第一摆脱延伸。 但未能在我们的路径..
回声“$(名前缀”$ {pathfile%。*}“)”
空间-file.tar#我相信我们需要exatly那
这里是一个重要的注意:我用双引号双引号来处理空间。 单引号不会通过因发短信$。 Bash是不寻常的,写着“第二个‘第一’引号”,因为扩张。
但是,你仍然需要考虑.hidden_files的
隐藏= “〜/ .bashrc中”回声“$(基名”$ {隐藏%。}“)” #会产生“〜”!
不是预期的“”结果。 要做到这一点,可以用$ HOME或/家庭/ user_path /
因为又是bash“不寻常”不扩大“〜”(搜索庆典BashPitfalls)
hidden2 = “$ HOME / .bashrc中”; 回声'$(名前缀“$ {pathfile%。}”)'