Ответ гораздо проще, чем кажется: вы никогда не повторяете эти переменные (когда не работает как root, очевидно), потому что вы уже выходите:))
Старайтесь избегать / минимизировать путаницу, добавляя более подходящие / лаконичные операторы отладки. Например, используйте одно эхо, которое содержит все , которое имеет отношение к вашей проблеме (то есть идентификатор процесса, идентификатор пользователя, var1, var2):
#!/bin/bash
export var1='var1'
if [ "$UID" != "0" ] ; then
export var2='var2'
while ! { sudo -v; }; do { sudo -v; }; done;
sudo $0
# this is "the key exit" ;-)
#exit
fi
echo "pid=[$$] uid=[$UID] var1=[$var1] var2=[$var2]"
С закомментированным выходом вы получите то, что ожидаете (очевидно, в «родительском» процессе, так как «дочерний» - тот, который выполняется как «root» - никогда не достигает той части кода, которая экспортирует var2):
pid=[12346] uid=[0] var1=[var1] var2=[]
pid=[12345] uid=[1] var1=[var1] var2=[var2]
++ иногда запускает скрипты в режиме отладки (bash -x) тоже помогает; -)