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.