Os comandos em um script são executados um por um, independentemente. O script em si como o pai de todos os comandos no script, é outro processo independente e o comando su não pode e não pode mudá-lo para root: o comando su cria um novo processo com privilégios de root.
Depois que o comando su for concluído, o processo pai, ainda em execução como o mesmo usuário, executará o restante do script.
O que você quer fazer é escrever um script de wrapper. Os comandos privilegiados vão para o script principal, por exemplo ~/main.sh
#!/bin/sh
ls /root
O script wrapper chama o script principal com permissões de root, como esta
#!/bin/sh
su -c ~/main.sh root
Para iniciar esse processo, você executa o wrapper, que, por sua vez, inicia o script principal depois de alternar o usuário para o usuário raiz.
Essa técnica de wrapper pode ser usada para transformar o script em um wrapper em torno de si mesmo. Basicamente, verifique se ele está sendo executado como root, se não, use "su" para se lançar novamente.
$ 0 é uma maneira útil de fazer um script se referir a si mesmo, e o comando whoami pode nos dizer quem somos (estamos arraigados?)
Assim, o script principal com o wrapper interno torna-se
#!/bin/sh
[ 'whoami' = root ] || exec su -c $0 root
ls /root
Observe o uso de exec. Significa "substituir este programa por", o que efetivamente termina sua execução e inicia o novo programa, lançado pelo su, com raiz, para executar a partir do topo. A instância de substituição é "root", por isso não executa o lado direito do ||