Primeiro, seu erro de sintaxe imediata: "$ line" é a string de dólar de 6 caracteres, espaço, l , i , n , e . Para obter o valor da variável line , use "$line" . Observe que, se o valor for -e ou -E , echo irá analisá-lo como uma opção e não imprimirá nada. Para evitar isso, use printf %s . Além disso, o% comum read retira os espaços em branco no início e no final da linha e trata as barras invertidas como caracteres de escape; para ler a linha literalmente, use IFS= read -r .
while IFS= read -r line; do
printf %s "$line" | …
fi
Não use o SHA-256 para senhas hash. Embora seja melhor que texto simples, ainda é ruim. SHA-256 não é uma maneira aceitável de hash senhas porque hashes de senha devem ser salgados e lentos. Consulte Como colocar senhas hash com segurança? para obter uma explicação detalhada. Você pode usar o utilitário comumente disponível mkpasswd para gerar hashes de senha decentes; use o SHA-256 ou SHA-512 (apesar de seu nome, eles estão ok porque eles não calculam um hash SHA2, eles calculam um hash iterado, que é aceitavelmente lento). O hash gerado inclui um sal aleatório.
printf %s "$line" | mkpasswd -s -m SHA-512
Em seu aplicativo, chame a função crypt do sistema para verificar esses hashes. Se a linguagem de programação que você está usando não lhe der acesso à biblioteca padrão crypt function, use uma biblioteca PBKDF2, bcrypt ou scrypt, e use essa biblioteca para gerar os hashes convertidos também (novamente, não use plain SHA-256 ou SHA-512).