如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]

Posted

技术标签:

【中文标题】如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]【英文标题】:How to check if a string contains a substring and does not in Bash [duplicate]如何检查字符串是否包含子字符串并且在 Bash 中不包含 [重复] 【发布时间】:2019-02-06 09:13:05 【问题描述】:

我想在 bash 中使用 switch/case 语句来检查作为字符串的文件名是否包含某些内容但也不包含。

这是我的情况:

case "$fileName" in
    *Failed|!cp*)
       echo "match"
     ;;
esac

但是目前这不起作用,如何查看字符串是否匹配“失败”但也不包含“cp”?

如果这也能在 switch/case 中完成就好了

【问题讨论】:

| in case 是 OR,而不是 AND。 我该如何做 AND? Switch case with fallthrough? 可能重复另请参阅How to use Shellcheck、How to debug a bash script? (U&L.SE)、How to debug a bash script? (SO)、How to debug bash script? (AskU)、Debugging Bash scripts 等。 【参考方案1】:

! 后面必须跟一个带括号的模式列表,而不是模式本身。

| 在 case 中是 OR,而不是 AND。要获得 AND,您应该嵌套案例。

case "$fileName" in
    *Failed)
        case "$fileName" in
            cp*) ;;
            *) echo "match" ;;
        esac
     ;;
esac

或者你可以只使用if 而不是case

if [[ $filename = *Failed && $filename != cp* ]]
then echo match
fi

【讨论】:

'extglob' 选项有什么用? 扩展通配符语法。【参考方案2】:

您也可以使用if 和管道,例如:

if echo 'Failed' | grep -v cp | grep -q Failed ; then
    echo Failed without cp
else
    echo It's either Winned or cp.
fi

【讨论】:

以上是关于如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 检查文件是不是包含特定字符串

如何检查一个对象是不是至少包含一个键,其值包含 JavaScript 中的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?