Você marcou sua pergunta com [bash]. Você não escreve um script para bash ou sh ou qualquer coisa, nem mesmo remotamente como o shell Bourne. Os scripts de lote do Windows geralmente são executados no shell cmd.exe , um descendente de COMMAND.COM do MS-DOS e possuem uma sintaxe completamente diferente.
Em particular, %name% , não $name , é a sintaxe das variáveis nos scripts em lote do Windows e do MS-DOS.
echo IP is %ip%
Enquanto você está nisso:
for /F "tokens=13" %%i in ('ipconfig | findstr IPv4 | findstr 172') do (