我知道如何检查文件扩展名,但我要问的是,是否有办法检查用户输入是否包含任何文件扩展名。
例如
./ myscript index.html的文件扩展名为
从技术上讲,我知道我可以使用类似
之类的标准bash检查文件扩展名FILE="$1"
FILE_EXT=${FILE##.*}
然而问题是,如果我有一个名为file.script.up.exe
的文件有多个点,显然它会在file.script
上结束我的file_ext,这不是我想要的。
从技术上讲,您可以使用FILE_EXT=$(echo "$FILE" | awk -F . '{print $NF}')
但是当程序在没有文件扩展名的情况下启动时会出现问题
所以基本上我需要的是创建一个if条件来检查脚本是否是使用文件扩展名启动的,并且根据结果,如果条件相应地采取行动
任何想法如何解决这个问题?
答案 0 :(得分:2)
请改为:
FILE="$1"
FILE_EXT=${FILE##*.}
与代码相比,唯一的变化是星号和点的顺序相反。
##
扩展运算符从变量中包含的字符串的开头开始删除模式的最长匹配。它是一种模式,而不是正则表达式,因此*
代表任何字符序列,.
代表字面时间。结果是,此扩展会删除文件名中的最后一个句点,包括文件名中的最后一个句点。
答案 1 :(得分:0)
awk
应该像这样使用:在打印最后一个之前检查数字字段。
FILE_EXT=$(echo "$FILE" | awk -F . '{if (NF>1) {print $NF}}')
答案 2 :(得分:0)
如果理解正确,则只需要文件中多个点的最后一个扩展名,例如some.file.ext
您需要ext
。
这通常很简单,但这里也是极端情况。例如,文件.profile
没有扩展名但有一个点。就像。
所以,我会使用不那么短的解决方案,也许有人会给你发一个更好的解决方案。
line="/some/full/path/name.to.file.ext"
regex='^(.+)\.([^.]+)$'
dir=$(dirname "$line")
base=$(basename "$line")
ext=""
if [[ "$base" =~ $regex ]]
then
fnoex="${BASH_REMATCH[1]}"
ext="${BASH_REMATCH[2]}"
else
fnoex="$base"
fi
#here you have 4x variables
# $dir - directory name
# $base - the filename
# $fnoex - filename without the extension
# $ext - the extension
原则是:
path
拆分为dirname
和filename
filename
(目录名称中的点上的错误匹配)上述内容应该适用于奇怪的路径和文件名,例如
/we.i.r d/.file #no ext
.file.ext. #no ext
./file.ext..ext2 #ext2