LINUX.ORG.RU
ФорумAdmin

bash, 16423143 - 16328411: синтаксическая ошибка в выражении (неверный маркер «16423143 - 16328411»)

 


0

2

Bash скрипт 1/FAILURE
[net] sv port 1111 nft bytes tmp 16423143
[net] sv port 1111 nft bytes old 16328411
строка difference=$(($tmp - $old)): 16423143
16423143 - 16328411: синтаксическая ошибка в выражении (неверный маркер «16423143 - 16328411»)

# Часть кода
tmp=$(nft -a list chain inet filter output | grep "sv_counter" | grep ${port} | awk '{ print $5 }')
if [[ -z $tmp ]]; then
	nice=${SERVICE_NICE_LOW}
else
	echo "[net] sv port ${port} nft bytes tmp ${tmp}"

	name_old="${nft_prefix}_${port}"
	old=${!name_old}
	if [[ -z $old ]]; then
		old=$tmp
	fi
	echo "[net] sv port ${port} nft bytes old ${old}"

	eval ${nft_prefix}_${port}=$tmp

	difference=$(($tmp - $old))

	if [[ $difference -gt $bytes_idle ]]; then
		echo "[net] sv port ${port} active, $difference gt $bytes_idle"
		sv=1
		nice=${nice_active}
	else
	    	nice=${SERVICE_NICE_LOW}
	fi
fi

Перемещено hobbit из general



Последнее исправление: drl (всего исправлений: 5)

Скрипт в кольце проверяет разницу байтов на порте udp, чтобы узнать есть ли трафик (подключения) у сервера.
Nice используется как магическое число для установки лимита ЦП, потому что сервер сильно грузит без подключений напрасно.
sleep не даёт 100% точности разницы, но временно сойдёт.
Я не понимаю почему скрипт ошибкой завершается на этой строке $(($tmp - $old))

drl
() автор топика
Ответ на: комментарий от IvanRia

eval ${nft_prefix}_${port}=$tmp

Это просто ${nft_prefix}_${port}=$tmp
Код получается такой prefix_1111=$tmp
В скрипте несколько портов просто.

попробуй вот такую отладку

[net] sv port 1111 nft bytes tmp 16423143
[net] sv port 1111 nft bytes old 16328411

drl
() автор топика
Ответ на: комментарий от drl

[net] sv port 1111 nft bytes tmp 16423143 [net] sv port 1111 nft bytes old 16328411

это же математическая операция, значит могут использоваться только числовые значения, а у вас строковые, в bash нет разницы между числовыми и строковыми, но в операциях есть.

может что-то путаю, но вроде так

IvanRia
()
Ответ на: комментарий от drl

Всеядный echo «${tmp}» в строку конвертирует.

echo не изменяет переменную, но у вас в переменной какой-то мусор, а в математической оперции могут быть только числа, без букв и разных знаков, если ошибка появляется после нескольких итераций, покажите echo на тех итерациях, где нет ошибки

IvanRia
()
Последнее исправление: IvanRia (всего исправлений: 1)
Ответ на: комментарий от drl

вообще, содержимое переменных можно проанализировать с помощью hexdump, может там непечатные символы и они вызывают ошибку

IvanRia
()
Последнее исправление: IvanRia (всего исправлений: 2)
Ответ на: комментарий от IvanRia

Примерно о том же думаю.

Если на одних входящих данных выражение

difference=$(($tmp - $old))
работает, а на других нет, то скорее всего проблема в этих данных.

Ради эксперимента я бы выкинул из переменных $tmp и $old все, кроме [0-9], и посмотрел на результат.

easybreezy
()