Você nunca deve analisar /etc/passwddiretamente. Você pode estar em um sistema com usuários remotos; nesse caso, eles não estarão /etc/passwd. O /etc/passwdarquivo pode estar em outro lugar. Etc.
Se você precisar de acesso direto ao banco de dados do usuário, use getent.
$ getent passwd phemmer
phemmer:*:1000:4:phemmer:/home/phemmer:/bin/zsh
$ getent passwd phemmer | awk -F: '{ print $6 }'
/home/phemmer
No entanto, há também outra maneira que não envolve a análise:
$ user=phemmer
$ eval echo "~$user"
/home/phemmer
O ~operador no shell se expande para o diretório inicial do usuário especificado. No entanto, temos que usar o evalporque a expansão da variável $userocorre após a expansão de ~. Portanto, usando as evalaspas e duplas, você estará expandindo efetivamente $userprimeiro e depois chamando eval echo "~phemmer".
Depois de ter o diretório inicial, siga /.sshpara o final.
$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh