Grundsätzlich werden bei " variablen von der Shell ersetzt, bei ' nicht, bei ' wird das als einfacher String interpretiert, bei
su -l -c "echo $SHELL"
wird also zuerst $SHELL ersetzt und der String an su übergeben, also
echo /bin/zsh. bei
su -l -c 'echo $SHELL'
wird $SHELL nicht ersetzt, es wird also tatsächlich
echo $SHELL an su übergeben, $SHELL wird dann von der loginshell ersetzt.