Existem dois problemas aqui. O que você está vendo é que você está usando um sinal de dólar na variável que está atribuindo - o sinal de dólar é usado para obter o valor de uma variável, e não para defini-la. Portanto, use a=$(echo "$p" | cut -d: -f1) em vez de $a=$(echo "$p" | cut -d: -f1) .
O segundo problema está na atribuição file="~/cs/cs3776/assignment2/passwd1.txt" - o ~ precisa ser expandido para o caminho para o diretório inicial, mas essa expansão não acontece quando está entre aspas duplas. Neste caso, não há mais nada que possa ser expandido, então apenas deixar de lado as cotações ( file=~/cs/cs3776/assignment2/passwd1.txt ) funcionaria. Se aspas forem necessárias para o resto da string, é possível citar parcialmente a string ( file=~/"cs/cs3776/assignment2/passwd1.txt" ).