Linux while循环bash中的if语句

Linux while循环bash中的if语句,linux,bash,shell,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

我试图制作一个脚本,在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;
这不太管用,我可以想其他办法得到这份工作,但如果我想这样做的话。 我的Web文件如下所示: somedomain.com 192.168.3.3。。。等等

这是我得到的错误:

第23行:[:编号 0:表达式错误标记中的语法错误为0

我尝试了许多方法来避免这个错误,将括号从[[改为],但我没有运气。

您的代码是犹太的,所以$result\u check显然不是一个数字。以下是一些建议:

在if检查之前添加一个echo if[$result\u check-eq 0]],以查看正在检查的内容。 在Bash中,有时保护字符串不为空是有帮助的。在这种情况下,保护是:if[[x$result\u check=x0]],但是你不能用该检查做任何有趣的整数,例如测试0和00的相等性会失败。如果[[0$result\u check-eq 0]]应该可以解决这个问题,但我还没有测试它。在我的系统上,[[函数实际上处理空字符串没有问题,所以[$undefined_variable-eq 0]]总是正确的。 您可以运行type[]来查看[[函数]实际上是什么。对我来说,它是一个shell关键字bash版本3.2。 为了好玩,可以尝试使用[函数。只要使用引号并添加前缀来防止空变量,这些简单测试的结果应该是相同的。
错误消息表明第一个mysql的输出以数字开头。也许有一种方法可以抑制列标题?啊,是的

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

此外,还需要清理语法

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
我不喜欢结果检查的临时变量,但是内联它会妨碍可读性,所以我想它必须保留


但是,更好的方法是在不存在或类似的情况下使用本机SQL结构进行插入。另请参见

错误是相同的,没有if的while循环工作正常。您的第二个建议仅适用于很久以前就应该消失的破损和过时的外壳。请停止给出如此丑陋和过时的外壳过时的建议,特别是当OP显然在使用Bash时!我不知道你认为kosher是什么意思,但代码显然被破坏了。@gniourf_gniourf这是个很好的建议。我使用古老的语法,因为我偶尔确实需要将代码移植到一个奇怪的shell。除非我是为zsh编写的,在这里兼容性会受到谴责!这是Bash,不是你的怪异,兄弟肯和古董外壳。你的建议在这里完全不相干。@gniourf_gniourf你可能会很高兴知道FreeBSD、NetBSD和Android使用奇怪的、破碎的古董外壳。Solaris呢?OpenSolaris?还有,我为之工作的上一家知名公司使用了tcsh或其所有linux部署,但由于不兼容,这几乎不算什么不管怎么说,所有伯恩·谢尔的惯例都是如此。