如何使用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脚本中是不是有后缀[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash shell脚本中包含文件

shell脚本报错:-bash:/bin/sh^M: bad interpreter:

如何在shell脚本中修改添加替换指定文件中的内容

Linux Shell脚本的执行过程

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?

如何在shell脚本中使用变量