在这里查看一些类似的问题,但仍然卡住了。我的代码出了什么问题?
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
答案 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