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?