@Rich: thank you for your answer.
You are right using double quotes it prints always the same line number, the line number in which trap is called because with the single quote the $LINENO is evaluated at execution (and trap works like a function: in fact if you use $LINEON in a function, it shows the line number in the function not in the script!!) instead with the double quote the $LINENO is evaluated when trap is defined.
Finally, I do not conditionally call exit in the script but I am using set -e to trap any unexpected error. This is very useful for script debugging and discover corner cases. I am used to use bash and I am used to use $LINENO but with busybox, it works differenty.
I checked the busybox website and I discovered that $LINENO has been added recently.
10 June 2019 -- BusyBox 1.31.0 (unstable)
and TinyCore Linux is using the pretty next release
25 October 2019 -- BusyBox 1.31.1 (stable)
So, I think that it is a issue related to busybox early $LINENO adoption.