Você nunca deve analisar /etc/passwd diretamente. Você pode estar em um sistema com usuários remotos e, nesse caso, eles não estarão em /etc/passwd . O arquivo /etc/passwd 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 é expandido para o diretório inicial do usuário especificado. No entanto, temos que usar o eval porque a expansão da variável $user acontece após a expansão de ~ . Então, usando o eval e aspas duplas, você está efetivamente expandindo $user primeiro, depois chamando eval echo "~phemmer" .
Uma vez que você tenha o diretório home, o argumento simples /.ssh até o final.
$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh