Exemplo de menu com itens dinâmicos (definidos em execução) no Dialog
#!/bin/bash
#
# Exemplo de como construir menus dinâmicos, onde os itens
# são a saída de um comando. Nos exemplos, serão obtidos os
# dados do arquivo /etc/passwd, como login, UID e nome.
#
# São três exemplos:
#
# 1) O mais simples. O comando retorna um login por linha.
# Como cada entrada do menu precisa de dois campos, no
# segundo campo foi colocado uma letra 'o', para ficar
# esteticamente bonito. Poderia ser um ponto '.' ou
# qualquer outro caractere ou texto. Outra alternativa
# é repetir o login. Isso pode ser feito trocando o
# comando sed para 's/.*/& &/'.
#
# 2) Aqui, o próprio comando já retorna dois campos por
# linha, no formato login:uid. Depois foi usado o tr
# pra trocar os : por espaços, separando os dados e
# deixando pronto para usar no menu.
#
# 3) Similar ao segundo, só que ao invés de pegar o 3o
# campo do passwd (uid), foi pego o 5o, que é o nome
# completo do usuário. O grande problema aqui é que
# como o nome tem espaços em branco, cada palavra é
# encarada como um parâmetro e bagunça o menu. A
# solução é colocar o nome entre \"aspas escapadas\"
# e usar o 'eval' para executar o comando.
#
# Para ficar bem claro o que está acontecendo, troque
# o 'eval' por um 'echo' para ver qual o comando final
# que está sendo executado. Aqui está ele:
#
# dialog --menu "Dois campos por linha, 2o item com espaços"
# 0 0 0 root "root" bin "bin" daemon "daemon" adm "adm"
# lp "lp" sync "sync" shutdown "shutdown" halt "halt"
# mail "mail" news "news" uucp "uucp" operator "operator"
# games "games" gopher "gopher" ftp "FTP User" ...
#
# 12 Agosto 2004 - Aurélio Marinho Jargas
ARQUIVO=/etc/passwd
dialog --menu 'Lista normal de um campo por linha' \
0 0 10 $(cat $ARQUIVO | cut -d: -f1 | sed 's/$/ o/')
dialog --menu 'Dois campos por linha, sem espaços nos itens' \
0 0 10 $(cat $ARQUIVO | cut -d: -f1,3 | tr : ' ')
eval \
dialog --menu \"Dois campos por linha, 2o item com espaços\" \
0 40 10 $(
IFS=:
while read login senha uid gid nome resto; do
echo $login \"$nome\"
done < $ARQUIVO
)