如何在bash中检查子字符串

时间:2015-12-22 15:29:34

标签: bash apache

在这里查看一些类似的问题,但仍然卡住了。我的代码出了什么问题?

check_conf_result=$(apachectl configtest 2>&1)
echo "Result of checking apache config: $check_conf_result"

if [[ "$check_conf_result" == *"Syntax OK"* ]]; then
        echo "Reload apache config"
        invoke-rc.d apache2 reload
else
        echo "Apache configure files wrong."
        #exit 1
fi

输出结果为:

Result of checking apache config: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
Syntax OK
/var/lib/dpkg/info/mybash.postinst: 114: [: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
Syntax OK: unexpected operator
Apache configure files wrong.

感谢。

更新

以下代码可行。 但仍然想知道为什么上面的代码不起作用??? (顺便说一下,这是debian / mybash.postinst的一部分)。通过搜索“[[:not found”,我发现我应该使用“#!/ bin / bash”如果我使用“if [[”$ check_conf_result“== ”语法OK“]] ; 然后”。最后,我使用了下面的案例陈述。

        case "$check_conf_result" in
                *Syntax[[:space:]]OK*)
                echo "Reload apache config"
                invoke-rc.d apache2 reload
                ;;
                *)
                echo "Apache config files wrong."
                exit 1
                ;;
        esac

2 个答案:

答案 0 :(得分:4)

在bash中,单个方括号不执行模式匹配。要使用它,您必须使用双方括号:

if [[ "$check_conf_result" == *"Syntax OK"* ]] ; then

man bash中记录了这一点:

string1 == string2
string1 = string2
     

如果字符串相等则为真。 =应与test命令一起使用                 POSIX一致性。与[[命令一起使用时,如上所述执行模式匹配(复合命令)。

测试:

#!/bin/bash
check_conf_result="Result of checking apache config: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
Syntax OK"

if [[ "$check_conf_result" == *"Syntax OK"* ]] ; then
    echo Matches.
fi

答案 1 :(得分:1)

不知道为什么choroba的答案在我的案子开始时不起作用。困惑了一段时间。现在,我发现“#!/ bin / sh”是我脚本​​中的shebang行。如果我把它改成“#!/ bin / bash”,他的回答是有效的。接受了他的回答。

已经通过以下代码解决了问题(也在我的更新中),因为我不想用/ bin / bash替换/ bin / sh:

case "$check_conf_result" in
        *Syntax[[:space:]]OK*)
        echo "Reload apache config"
        invoke-rc.d apache2 reload
        ;;
        *)
        echo "Apache config files wrong."
        exit 1
        ;;
esac