下面的代码有什么问题?
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已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。
当前回答
这个包含了所有的可能性!(点在路径上与否;延长或不延长):
Tmp1 =${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo -n ${Tmp1:0:1};echo ${tmp2%.*})
注:
它提供了没有任何扩展名的文件名。因此$filename_noextension变量中没有路径。 最后得到两个不需要的变量$tmp1和$tmp2。确保没有在脚本中使用它们。
测试示例:
文件名= . bashrc;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= .bashrc.txt;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= .bashrc.txt.tar;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= ~ / . bashrc;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= ~ / .bashrc.txt.tar;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= bashrc; (Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= bashrc.txt;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= bashrc.txt.tar;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= ~ / bashrc; (Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
文件名= ~ / bashrc.txt.tar;Echo“filename: $filename”;文件名tmp1 = $ {# # * /}; tmp2 = $ {tmp1:1}; filename_noextension = $ (echo - n $ {tmp1:0:1}; echo $ {tmp2%。*});Echo“没有扩展名的文件名:$filename_noextension”
其他回答
你也可以使用参数展开:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
只是要注意,如果没有文件扩展名,它将进一步向后寻找点,例如。
如果文件名只是以点开始(例如。bashrc),它将删除整个文件名。 如果只在路径中有一个点(例如path。到/myfile或。/myfile),那么它将在路径内部进行修剪。
如果知道扩展名,可以使用basename
$ basename /home/jsmith/base.wiki .wiki
base
仅使用POSIX的内置:
#!/usr/bin/env sh
path=this.path/with.dots/in.path.name/filename.tar.gz
# Get the basedir without external command
# by stripping out shortest trailing match of / followed by anything
dirname=${path%/*}
# Get the basename without external command
# by stripping out longest leading match of anything followed by /
basename=${path##*/}
# Strip uptmost trailing extension only
# by stripping out shortest trailing match of dot followed by anything
oneextless=${basename%.*}; echo "$oneextless"
# Strip all extensions
# by stripping out longest trailing match of dot followed by anything
noext=${basename%%.*}; echo "$noext"
# Printout demo
printf %s\\n "$path" "$dirname" "$basename" "$oneextless" "$noext"
打印输出的演示:
this.path/with.dots/in.path.name/filename.tar.gz
this.path/with.dots/in.path.name
filename.tar.gz
filename.tar
filename
我的建议是使用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%.*}")'
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
你想用哪个就用哪个。这里我假设是最后一个。(点)后面跟着文本是扩展。