OK, to sum up the various input and in case you want to stick with your for syntax.
read $sni
This is indirection. You are not reading into the variable ${sni} but into the variable whose name is held by ${sni}, e.g.:
$ foo=bar
$ read $foo <<< "quux"
$ echo "${foo}"
bar
$ echo "${bar}"
quux
So this should be
read sni
instead. And about ...
for i in {sni..snf}
... this does not work because you are not treating your variables as variables here.
If you use ksh  then you can do
for i in {${sni}..${snf}}; do
    ...
done
but bash is not so clever in which case you want to use
for i in $(seq ${sni} ${snf}); do
    ...
done
So the whole thing should look more like:
#!/bin/sh
read sni
read snf
echo "Run between '${sni}' and '${snf}'"
for i in $(seq ${sni} ${snf}); do
        echo "i=$i"
done
Example:
$ printf "1\n4\n" | ./t.sh
Run between '1' and '4'
i=1
i=2
i=3
i=4
     
    
read sni, because you don't want variable interpolation there.seq(withbashanyway).ksh, which is cleverererer thanbashand there it works :-)