BASH:在测试条件之前检查错误

时间:2012-03-01 21:57:14

标签: mysql linux bash shell

我正在尝试编写一个简单的Bash脚本来监视MySQL复制状态。脚本是这样的:

#!/bin/bash
dbhost=192.168.1.2
repluser=root
replpasswd=password
echo "show slave status\G"|\
mysql -h $dbhost -u $repluser -p$replpasswd > tmpd 2>/dev/null
repl_IO=$(cat tmpd | grep "Slave_IO_Running" | cut -f2 -d':')
repl_SQL=$(cat tmpd | grep "Slave_SQL_Running" | cut -f2 -d':')
if [ $repl_IO != "Yes" -o $repl_SQL != "Yes" ] ; then
     echo
     echo -e "\033[31m Replication Error."
     echo -e "\033[0m"
     mail -s "replication error" email@domain.com < tmpd

else
     echo
     echo -e "\033[32mReplication is working fine"
     echo -e "\033[0m"

fi

问题是该脚本仅在主服务器和从服务器都启动时才有效。如果主服务器已关闭,并且我运行该脚本,则会显示错误消息并发送电子邮件。 如果主/从都启动,脚本显示“复制正常”,这没关系。但是当我关闭奴隶并运行脚本时,我收到了这个错误:

./monitor.bash: line 9: [: too many arguments

Replication is working fine

我知道问题是因为我正在查询从属MySQL服务器,所以它找不到它。所以它没有检查条件Slave_IO_Running和Slave_SQL_Running。我怎么去 在运行这些条件之前检查从服务器是否已启动。所以简而言之,我只想要“复制工作正常”才能显示出来,如果主人和奴隶起来了 跑步,它符合这些条件。任何帮助,将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:4)

如果$repl_IO$repl_SQL为空,则为:

if [ $repl_IO != "Yes" -o $repl_SQL != "Yes" ] ; then

相当于:

if [ != Yes -o != Yes ] ; then

我认为你可以看出为什么这不起作用。您需要将参数扩展包装在双引号中,以便它们被视为单个参数,无论它们包含什么:

if [ "$repl_IO" != "Yes" -o "$repl_SQL" != "Yes" ] ; then

或使用[[...]]代替[...],因为这些事情更聪明一点:

if [[ $repl_IO != "Yes" -o $repl_SQL != "Yes" ]] ; then

或两者:

if [[ "$repl_IO" != "Yes" -o "$repl_SQL" != "Yes" ]] ; then

答案 1 :(得分:1)

您的脚本存在一个问题:有经验的shell程序员知道如果变量为空,则声明为

if [$ foo = something]

将看起来像

这样的shell

if [= something]

您可以使用

解决此问题

if [“$ foo”= something]

所以一般来说,在[]

中使用“所有变量的标记”

答案 2 :(得分:0)

如果您使用bash,则使用[[ ]],不需要引用变量,它比[ ]更强大。

freenode的IRC频道上的greybot说:

  

[[是一个类似的bash关键字(但比...更强大)[   命令。见http://mywiki.wooledge.org/BashFAQ/031和   http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非   你正在为POSIX sh写作,我们建议[[。