如何使用if来查看文件在shell bash脚本中是不是有后缀[重复]
Posted
技术标签:
【中文标题】如何使用if来查看文件在shell bash脚本中是不是有后缀[重复]【英文标题】:how to use if to see whether file has suffix in shell bash script [duplicate]如何使用if来查看文件在shell bash脚本中是否有后缀[重复] 【发布时间】:2012-07-05 12:11:39 【问题描述】:如果[xxx]
如何表达字符串或文件包含'.'
我是学习shell的新手,感谢任何帮助
【问题讨论】:
【参考方案1】:您可以使用匹配运算符:
$ if [[ "abc.def" =~ \. ]]; then echo "yes"; else echo "no"; fi
yes
$ if [[ "abcdef" =~ \. ]]; then echo "yes"; else echo "no"; fi
no
如果点是字符串中的第一个或最后一个(或唯一一个)字符,则匹配。如果您希望点的两边都有字符,您可以执行以下操作:
$ if [[ "ab.cdef" =~ .\.. ]]; then echo "yes"; else echo "no"; fi
yes
$ if [[ ".abcdef" =~ .\.. ]]; then echo "yes"; else echo "no"; fi
no
$ if [[ "abcdef." =~ .\.. ]]; then echo "yes"; else echo "no"; fi
no
你也可以使用模式匹配:
$ if [[ "ab.cdef" == *?.?* ]]; then echo "yes"; else echo "no"; fi
yes
$ if [[ ".abcdef" == *?.?* ]]; then echo "yes"; else echo "no"; fi
no
$ if [[ "abcdef." == *?.?* ]]; then echo "yes"; else echo "no"; fi
no
模式和正则表达式的一个很好的参考是Greg's Wiki
【讨论】:
加号可以省略,.\..
就足够了。
你不需要使用 RE,shell 模式匹配就可以了。
@DennisWilliamson +1 谢谢你,你当然是对的。我已根据您的建议改进了答案。
@cdarke +1 谢谢。非常真实。我已将此添加到答案中。【参考方案2】:
bash
支持 glob 样式的模式匹配:
if [[ "$file" = *?.?* ]]; then
...
fi
请注意,这也假定了一个 前缀 - 这也确保它不会匹配 .
和 ..
目录。
如果你想检查一个特定的扩展:
if [[ "$file" = *?.foo ]]; then
...
fi
【讨论】:
【参考方案3】:echo "xxx.yyy" | grep -q '\.'
if [ $? = 0 ] ; then
# do stuff
fi
或者
echo "xxx.yyy" | grep -q '\.' && <one statement here>
#e.g.
echo "xxx.yyy" | grep -q '\.' && echo "got a dot"
【讨论】:
这不仅效率低下,因为它启动了一个额外的进程 (grep
),而且它也不正确:在正则表达式中,单个未转义的点匹配每个字符。也许您的意思是'\.'
而不是'.'
?
正确。我的印象是单引号删除了正则表达式 - 它没有。 '。'需要转义。以上是关于如何使用if来查看文件在shell bash脚本中是不是有后缀[重复]的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本报错:-bash:/bin/sh^M: bad interpreter: