Answers:
要在脚本/命令中执行命令时,应使用命令替换语法$(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
echo $filename | cut -f1 -d'.'
$()
是首选。
您还可以使用参数扩展:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
。谢谢。
image.png.gz
?
%.*
只删除最后一个扩展名;如果要删除所有扩展名,请使用%%.*
。
如果知道扩展名,则可以使用基本名称
$ basename /home/jsmith/base.wiki .wiki
base
.wiki
并最终得到/home/jsmith/base
?
我的建议是使用basename
。
在Ubuntu中,默认情况下是默认代码,它看起来很简单,可以处理大多数情况。
以下是一些处理空格和多点/子扩展名的子情况:
pathfile="../space fld/space -file.tar.gz"
echo ${pathfile//+(*\/|.*)}
它通常从一开始就摆脱扩展.
,但在我们的..
道路上失败了
echo **"$(basename "${pathfile%.*}")"**
space -file.tar # I believe we needed exatly that
这里有个重要的注意事项:
我在双引号中使用了双引号来处理空格。由于发短信给$,因此单引号不会通过。Bash是不寻常的,并且由于扩展而读取“第二个“第一”引号”。
但是,您仍然需要考虑 .hidden_files
hidden="~/.bashrc"
echo "$(basename "${hidden%.*}")" # will produce "~" !!!
不是预期的“”结果。为了使它成为
现实,$HOME
或者/home/user_path/
因为bash再次“不寻常”并且不要扩展“〜”(搜索bash BashPitfalls),
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.*}")'
#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"
输出:
program
正如Hawker65在chepner答案的评论中指出的那样,投票最多的解决方案既不考虑多个扩展名(例如filename.tar.gz),也不考虑路径其余部分中的点(例如this.path / with) .dots / in.path.name)。可能的解决方案是:
a=this.path/with.dots/in.path.name/filename.tar.gz
echo $(dirname $a)/$(basename $a | cut -d. -f1)
basename $filename .exe
会做同样的事情。假设您始终知道要删除的扩展名。