Aqui está minha versão:
#!/bin/bash
bash=0;
nologin=0;
csh=0;
ksh=0;
while read line;
do
innerline=$(echo "$line"| cut -d: -f7)
if [[ $innerline == "/bin/bash" ]]
then
bash=$(echo "$bash+1"|bc);
elif [[ $innerline == "/sbin/nologin" ]]
then
nologin=&(echo "$nologin+1"|bc);
elif [[ $innerline == "/bin/csh" ]]
then
csh=$(echo "$csh+1"|bc);
else
ksh=$(echo "$ksh+1"|bc);
fi
done < /etc/passwd
echo "$bash $nologin $csh $ksh"
Para incrementar os valores, passo o trabalho de cálculo para bc
, que é um pequeno utilitário de cálculo.
Deixe-me saber se funciona para você.
Para ser honesto, devo dizer que realmente não gosto dessa solução. Embora o loop seja desnecessário e prefiro a solução @Nat, no entanto, como você afirmou claramente que o loop deve estar presente - aqui está.
PS. Esta é apenas uma ideia terrível:
else
ksh=$(echo "$ksh+1"|bc);
para assumir que todo shell desconhecido / sem correspondência é ksh
.