下面的代码有什么问题?

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

就像这样,我得到的字面值字符串$filename | cut -f1 -d'。',但如果我删除引号,我什么也得不到。与此同时,打字

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

在shell中给出我想要的输出,test。我已经知道$filename已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。


当前回答

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

echo $filename | rev | cut -f 2- -d '.' | rev

其他回答

#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"

输出:

program

当您希望在script/command中执行命令时,应该使用命令替换语法$(command)。

所以直线是

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

代码的解释:

Echo获取变量$filename的值并将其发送到标准输出 然后获取输出并将其输送到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 | rev | cut -f 2- -d '.' | rev

你也可以使用参数展开:

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

只是要注意,如果没有文件扩展名,它将进一步向后寻找点,例如。

如果文件名只是以点开始(例如。bashrc),它将删除整个文件名。 如果只在路径中有一个点(例如path。到/myfile或。/myfile),那么它将在路径内部进行修剪。

在Zsh:

fullname=bridge.zip
echo ${fullname:r}

它简单,干净,可以被链接以删除多个扩展:

fullname=bridge.tar.gz
echo ${fullname:r:r}

它可以与其他类似的修饰语结合使用。