O shell faz uma única passagem nos parâmetros de expansão, então $user é expandido, mas o ~ anterior não é expandido. Para recuperar a linha de entrada, use eval :
...
eval sudo du -sh ~$user
...
Quando digito sudo du -sh ~student1 , obtenho a saída esperada (veja a captura de tela). No entanto, quando tento usar o script abaixo:
#!/bin/bash
for user in "$@"; do
sudo du -sh ~$user
done
para fazer a mesma coisa, recebo um erro que o diretório não existe. Aqui é uma captura de tela.

(Euseiquepossofazersudodu-shstudent1student2...,equeoscriptbashéinútil,maseuaindanãoentendoporqueissonãofunciona.)
Eudeiumaolhada