我正在尝试编写一个简单的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。我怎么去 在运行这些条件之前检查从服务器是否已启动。所以简而言之,我只想要“复制工作正常”才能显示出来,如果主人和奴隶起来了 跑步,它符合这些条件。任何帮助,将不胜感激。谢谢。
答案 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]
将看起来像
这样的shellif [= something]
您可以使用
解决此问题if [“$ foo”= something]
所以一般来说,在[]
中使用“所有变量的标记”答案 2 :(得分:0)
如果您使用bash,则使用[[ ]]
,不需要引用变量,它比[ ]
更强大。
[[是一个类似的bash关键字(但比...更强大)[ 命令。见http://mywiki.wooledge.org/BashFAQ/031和 http://mywiki.wooledge.org/BashGuide/TestsAndConditionals。除非 你正在为POSIX sh写作,我们建议[[。