if语句在while循环bash中

时间:2015-02-17 07:58:10

标签: linux bash shell

我正在尝试制作在mysql中为某些网站插入主机名和IP地址的脚本,但在脚本插入结果之前我想检查它们是否已经存在,如果是,脚本不应该插入它。

result_check=$(mysql -uroot -p123qwe webs -e "SELECT COUNT(*) AS NUMBER FROM webs WHERE hostname='$hostname' AND ip='$ip'";)
        cat $dir/webs | while read hostname ip; do
    if [[ $result_check -eq 0 ]]; then
    echo "INSERT INTO webs (hostname,ip) VALUES ('$hostname','$ip');"
    fi;
    done | mysql -uroot -p123qwe webs;

这种方式不起作用,我可以想到其他方式来完成工作(没有if),但我想这样做。 我的网站文件看起来像这样: somedomain.com 192.168.3.3 ......等等。

这是我得到的错误:

第23行:[[:NUMBER 0:表达式中的语法错误(错误标记为" 0")

我已经尝试了很多方法来逃避这个错误(更改[[to(()的括号,但我没有运气。

2 个答案:

答案 0 :(得分:1)

错误消息表明第一个mysql的输出以NUMBER开头。也许有一种方法可以抑制列标题?啊,是的,the -N option

其次,您似乎要求从文件中读取的值出现在查询中,因此您必须相应地重新排列。

此外,您希望清除语法。

while read hostname ip; do
    result_check=$(mysql -N -uroot -p123qwe webs \
        -e "SELECT COUNT(*) AS NUMBER FROM webs WHERE hostname='$hostname' AND ip='$ip'")
    if [[ $result_check -eq 0 ]]; then
        echo "INSERT INTO webs (hostname,ip) VALUES ('$hostname','$ip');"
    fi
done <"$dir"/webs | mysql -uroot -p123qwe webs

我不喜欢result_check的临时变量,但是内联它会妨碍可读性,所以我想它必须留下来。

但是,更好的方法是使用INSERT ... WHERE NOT EXISTS或类似的本机SQL构造。另请参阅How to 'insert if not exists' in MySQL?

答案 1 :(得分:-1)

您的代码是犹太教,因此$result_check显然不是数字。以下是一些建议:

  1. echo if [[ $result_check -eq 0 ]]检查之前添加if以查看正在检查的内容。
  2. 在Bash中,有时候有助于防止字符串变空。在这种情况下,保护将是:if [[ "x$result_check" = x0 ]],但您不能使用该检查执行任何有趣的整数操作,例如测试“0”和“00”的相等性将失败。 if [[ "0$result_check" -eq 0 ]]应该解决这个问题,但我还没有测试过。在我的系统上,[[函数实际上处理空字符串没有问题,因此[[ $undefined_variable -eq 0 ]]始终为真。
  3. 您可以运行type [[来查看[[功能实际上是什么。对我来说,它是一个shell关键字(bash版本3.2)。
  4. 为了好玩,请尝试使用[功能。只要您使用引号并添加前缀以防止空变量,这些简单测试的结果应该相同。