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


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

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

Попробую, но там и так не должно быть больше одной строки.

drl ()

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

	eval ${nft_prefix}_${port}=$tmp
        echo $tmp
	difference=$(($tmp - $old))

да и что в old находится тоже проверь

IvanRia ()
Последнее исправление: IvanRia (всего исправлений: 3)
Ответ на: комментарий от 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 ()
Ответ на: комментарий от drl

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

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

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

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

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

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

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

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

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

вот так можно попробовать:

$ var1=100 var2=200 difference=
$ (( difference = var1 + var2 ))
$ echo $difference 
300
$ 
IvanRia ()

была бы не русифицирована система, можно было бы поискать в гугле ошибку, а неверный маркер, хрен где найдешь

IvanRia ()
Ответ на: комментарий от IvanRia
+ tmp=1601226324
+ [[ -z 1601226324 ]]
+ echo '[net] sv port 1111 nft bytes tmp 1601226324'
[net] sv port 1111 nft bytes tmp 1601226324
+ name_old=prefix_1111
+ old=1600656602
+ [[ -z 1600656602 ]]
+ echo '[net] sv port 1111 nft bytes old 1600656602'
drl ()
Ответ на: комментарий от drl

у меня кончились варианты

еще один вариант, в самом начале скрипта объявите переменные как числовые

declare -i tmp old

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

плюсую set +x в начале скрипта. и шебанг лайн я не вижу. надеюсь, он прописан и там именно баш :)

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

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

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

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

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

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

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

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

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

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

значит, скорее всего, в переменную поподало несколько строк

IvanRia ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.