下面的代码有什么问题?
name='$filename | cut -f1 -d'.''
就像这样,我得到的字面值字符串$filename | cut -f1 -d'。',但如果我删除引号,我什么也得不到。与此同时,打字
"test.exe" | cut -f1 -d'.'
在shell中给出我想要的输出,test。我已经知道$filename已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。
下面的代码有什么问题?
name='$filename | cut -f1 -d'.''
就像这样,我得到的字面值字符串$filename | cut -f1 -d'。',但如果我删除引号,我什么也得不到。与此同时,打字
"test.exe" | cut -f1 -d'.'
在shell中给出我想要的输出,test。我已经知道$filename已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。
当前回答
#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"
输出:
program
其他回答
你的代码有两个问题:
您使用' (tick)而不是'(反tick)来包围生成想要存储在变量中的字符串的命令。 您没有将变量“$filename”“echo”到管道中的“cut”命令中。
我会把你的代码改为"name= ' echo $filename | cut -f 1 -d '。' ' ",如下所示(再次注意,后面的勾号围绕着name变量定义):
$> 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
我的建议是使用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 bash)
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.*}")'
假设你的文件有。new扩展名
ls -1 | awk '{ print "mv "$1" `basename "$1" .new`"}' | sh
由于张贴后不显示特别报价,请参阅图片。
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}
输出:
/tmp/foo.bar.gz /tmp/foo.bar
注意,只有最后一个扩展被删除。