Основная проблема заключается в том, что вы используете три одинарных -кавычки до и после каждой переменной вместо одной. Это не обязательно -на самом деле, это не сработает.
Вы получаете сообщение об ошибке с IP-адресом $downlocalip
, потому что он фактически не заключен в кавычки, поэтому sqlite3 пытается интерпретировать его как число с плавающей запятой, а не как текстовую строку... а числа с плавающей запятой не имеют двух десятичных знаков точки в них.
Еще одна незначительная проблема заключается в том, что вы заключаете в одиночные -кавычки значения для целочисленных полей(downspeed
иupspeed
).
Попробуйте вместо этого:
sqlite3 /var/www/server/newserverstats.db "UPDATE stats SET downspeed=$DN,
upspeed=$UP, downlocalip='$downlocalip', downremoteip='$downremoteip',
uplocalip='$uplocalip', upremoteip='$upremoteip' WHERE primkey=1;"
Одинарные -кавычки в этой строке находятся внутри двойных -кавычек, поэтому не препятствуйте расширению переменных оболочкой. Они не имеют особого значения внутри двойных -кавычек, они просто часть текста. Переменные имеют особое значение внутри двойных -кавычек, поэтому они расширяются, как и следовало ожидать.
Или используйте heredoc, поскольку в ответе Кусалананды -он более удобочитаем.
Кстати, если вы выполняете МНОЖЕСТВО операций sqlite, лучше написать сценарий на языке, в котором есть библиотечный модуль sqlite, поддерживающий значения-заполнители. например. и perl
, и python
имеют отличные библиотеки для работы с sqlite3 и другими базами данных SQL. Обычно вы можете писать код с использованием этих библиотек, так что они требуют мало, если таковые вообще имеются,изменения для работы с другими базами данных, такими как postgresql или mysql.