Ir ao conteúdo
  • Cadastre-se

Outro Script - Dialog cria menu mas não executa código associado a item


Posts recomendados

Bom dia a todos, sou programador junior e estou com um problema com a execução de itens com o dialog e não estou conseguindo resolver. Se alguém puder dar uma mão, agradeço.. O problema é o seguinte : O código abaixo que criei, gera um menu dinâmico a partir de um txt populado de outro script.. a geração do menu dinâmico funciona e esta ok, cada linha do menu tem 3 partes : um ID (deveria ser numérico), um texto (que deveria aparecer na linha do menu para ou usuário escolher) e um status (que não precisaria aparecer para o usuário, mas tudo bem).. O menu gera sem problemas, o problema é que eu gostaria de para cada seleção que o usuário escolhe-se, executasse o código correspondente do ID da linha e logo após, eliminasse a linha correspondente do menu. Caso eu reexecutasse de novo o código, o novo menu criado não deveria mais trazer a linha que foi executada exitosamente, mas não estou conseguindo fazer isso .. Código abaixo :

 #!/bin/bash
 # Define o nome do arquivo de relatório
report_file="scripts/hmenu/result.txt"
# Lê o arquivo result.txt no subdiretório scripts/ hmenu /
while read line; do
  # Extrai o ID, o texto e o status da linha
  id=$(echo $line | awk '{print $1}')
  text=$(echo $line | awk '{print $2 " " $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9}')
  status=$(echo $line | awk '{print $10}')
  # Adiciona o item de checkbox ao menu
  options+=("$id" "$text" "$status")
done < $report_file

# Exibe o menu em forma de checkbox
selected=$(dialog --backtitle "Selecione os itens desejados:" \                   
--checklist " " 20 60 15 \                   
"${options[@]}" \                  
 --output-fd 1 \                   
--separate-output \                   
--scrollbar \                  
 3>&1 1>&2 2>&3)
 
# Executa cada item selecionado
for item in $selected; do
  if [ "$item" == "1" ]; then
    echo "Executando o código para o Item 1..."
    sed -i "/ $item/d" $report_file
 
fi
  if [ "$item" == "2" ]; then
    echo "Executando o código para o Item 2..."
    sed -i "/ $item/d" $report_file
  fi

done

Agradeço antecipadamente a ajuda!!!!

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Pelo que entendi do seu código, você está tentando executar um script específico dependendo da seleção do usuário em um menu dinâmico gerado a partir de um arquivo de texto. Depois de executar o script, você deseja remover a linha correspondente do arquivo de texto para que ela não apareça no próximo menu gerado.

O seu código atual parece estar quase lá, mas há algumas coisas que precisam ser ajustadas. O primeiro problema é que você está usando o valor do ID como o valor do item de seleção do menu. Isso pode funcionar em alguns casos, mas pode levar a problemas se o valor do ID contiver caracteres que o dialog não pode lidar. Em vez disso, é melhor usar o índice da linha no array options como o valor do item de seleção do menu.

Para fazer isso, você pode criar uma variável count no início do script e incrementá-la a cada linha que for adicionada ao array options. Em seguida, você pode usar o valor de count como o valor do item de seleção do menu. Dessa forma, você pode ter certeza de que o valor do item de seleção será sempre um número inteiro válido.

Aqui está uma versão modificada do seu script que faz isso:

#!/bin/bash

# Define o nome do arquivo de relatório
report_file="scripts/hmenu/result.txt"

# Inicializa o contador
count=0

# Lê o arquivo result.txt no subdiretório scripts/hmenu
while read line; do
  # Extrai o ID, o texto e o status da linha
  id=$(echo $line | awk '{print $1}')
  text=$(echo $line | awk '{print $2 " " $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9}')
  status=$(echo $line | awk '{print $10}')

  # Adiciona o item de checkbox ao menu
  options+=("$count" "$text" "$status")

  # Incrementa o contador
  ((count++))
done < "$report_file"

# Exibe o menu em forma de checkbox
selected=$(dialog --backtitle "Selecione os itens desejados:" \
  --checklist " " 20 60 15 "${options[@]}" \
  --output-fd 1 \
  --separate-output \
  --scrollbar \
  3>&1 1>&2 2>&3)

# Executa cada item selecionado
for item in $selected; do
  # Obtém a linha correspondente do arquivo
  line=$(sed -n "${item}p" "$report_file")

  # Obtém o ID e o comando do item
  id=$(echo "$line" | awk '{print $1}')
  command=$(echo "$line" | awk '{$1=""; print $0}')

  # Executa o comando
  echo "Executando o código para o Item $id..."
  eval "$command"

  # Remove a linha correspondente do arquivo
  sed -i "${item}d" "$report_file"
done

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!