Você parece ter misturado a sintaxe de for e while . for executa uma seqüência de comandos para cada elemento em uma lista; a sintaxe é for VARIABLE in VALUES; do COMMANDS; done : a palavra-chave in separa o nome da variável da lista de valores. while executa uma seqüência de comandos enquanto outra seqüência de comandos é verdadeira; a sintaxe é while COMMANDS; do COMMANDS; done .
O comando read lê uma linha e a divide em campos. Os argumentos de read são as variáveis para definir os valores do campo. Portanto read in USUARIO define in para o primeiro campo e USUARIO para o segundo campo, ou se houver mais de dois campos (o que é o caso em seu cenário) USUARIO é definido para todos os campos restantes (interno separadores incluídos). Cada chamada para read lê uma única linha e cada iteração de loop, portanto, processa uma linha da entrada.
Assim, para imprimir somente os nomes de usuário, você precisa escrever
while IFS=: read USUARIO rest
do
echo "$USUARIO"
done
Em relação à segunda pergunta (mas da próxima vez, não faça perguntas não relacionadas), o problema é que cada comando em um pipeline é executado em uma sub-shell, então as variáveis definidas em uma delas não são visíveis fora da o gasoduto. Veja Por que minha variável local é um loop 'while read', mas não em outro loop aparentemente similar?