我正在尝试制作在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(()的括号,但我没有运气。
答案 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
显然不是数字。以下是一些建议:
echo if [[ $result_check -eq 0 ]]
检查之前添加if
以查看正在检查的内容。if [[ "x$result_check" = x0 ]]
,但您不能使用该检查执行任何有趣的整数操作,例如测试“0”和“00”的相等性将失败。 if [[ "0$result_check" -eq 0 ]]
应该解决这个问题,但我还没有测试过。在我的系统上,[[
函数实际上处理空字符串没有问题,因此[[ $undefined_variable -eq 0 ]]
始终为真。type [[
来查看[[
功能实际上是什么。对我来说,它是一个shell关键字(bash版本3.2)。[
功能。只要您使用引号并添加前缀以防止空变量,这些简单测试的结果应该相同。