Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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

 

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...