Você já tem uma resposta dizendo como fazer isso totalmente no bash com um loop while ... read ... ... Gostaria de sugerir que fazer isso apenas no bash é uma das piores maneiras de fazer isso.
Além disso, ler /etc/group em si não é uma boa idéia porque esse arquivo é apenas uma das possíveis fontes de dados de grupo (outras fontes podem incluir LDAP, Active Directory, winbind, NIS, mysql, pgsql, arquivos db Berkeley, arquivos de grupo extras de libnss-extrausers e muitos mais).
Em vez disso, use a saída de getent group .
Tente isto:
g=( $(getent group | awk -F: '{print $3}') )
ou
g=( $(getent group | cut -d: -f3) )
O método awk é particularmente útil se você quiser combiná-lo com pesquisa de texto fixo ou regular e / ou outros critérios de seleção (por exemplo, $1 == groupname ou $3 >= 500 && $3 <= 1000 )
BTW para, por exemplo, depuração, você pode imprimir os grupos na matriz g com, por exemplo:
# all on one line
echo "${g[@]}"
# one element per line
printf "%s\n" "${g[@]}"
# in a format that can be re-used to define the variable in another
# bash shell or script.
declare -p g
Eu particularmente gosto de declare -p para depuração - ele não mostra apenas o nome da variável (por exemplo, semelhante a echo "foo='$foo'" ), ele também mostra os índices de matriz para variáveis de matriz e tudo é corretamente citado e escapou com contrabarra:
$ g=( $(getent group | awk -F: '$1 ~ /my/ {print $1}') )
$ declare -p g
declare -a g='([0]="mysql" [1]="mythtv")'
BTW typeset é sinônimo de declare que funciona no bash e também alguns outros shells como o ksh.