Autor Tópico: Ajuda em script con dialog  (Lida 3804 vezes)

Offline gohan123

  • Usuário Ubuntu
  • *
  • Mensagens: 2
    • Ver perfil
Ajuda em script con dialog
« Online: 13 de Fevereiro de 2023, 11:59 »

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

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 496
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube
Re:Ajuda em script con dialog
« Resposta #1 Online: 13 de Fevereiro de 2023, 16:48 »
Oi.

Coloque seu código-fonte entre \[code\] e \[/code\] (sem as contrabarras). Assim fica mais fácil de analisar e evita que o parser interprete alguma porção do seu código como se fosse tag de formatação (como parece ter acontecido ali depois de "${options).

Fica um pouco difícil analisar o comportamento do script sem dispor de um arquivo resultado.txt etc., mas tenho a impressão de que o que você quer fazer está relacionado ao comportamento do comando sed. Enfim, experimente substituir:

Código: [Selecionar]
sed -i "/ $item/d" $report_file
...por:

Código: [Selecionar]
sed -i "/^$item/d" $report_file
Caso aquele espaço antes de $item tenha sido intencional (i.e. cada linha inicia mesmo com um espaço em branco antes do $item), então o código a ser usado é este:

Código: [Selecionar]
sed -i "/^\s$item/d" $report_file
Yuri Sucupira ("Sampayu")

Offline gohan123

  • Usuário Ubuntu
  • *
  • Mensagens: 2
    • Ver perfil
Re:Ajuda em script con dialog
« Resposta #2 Online: 13 de Fevereiro de 2023, 18:02 »
Obrigado pela resposta  Sampayu mas infelizmente não é esse o problema.. Com ou sem espaço, não executa o código baixo do item. ele simplesmente não relaciona o ID da opção do menu com o ID da linha do arquivo e não executa nada nem o código e nem deleta a linha do arquivo..
Sobre o arquivo result.txt é um arquivo simples com a seguinte estrutura :
id, texto, status
1 verificar pontos de fuga [pass]
2 analisar pontos fracos    [Not Pass]
3 verificar e analisar vigas [pass]
etc...

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 496
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube
Re:Ajuda em script con dialog
« Resposta #3 Online: 13 de Fevereiro de 2023, 20:33 »
Com ou sem espaço, não executa o código baixo do item. ele simplesmente não relaciona o ID da opção do menu com o ID da linha do arquivo e não executa nada nem o código e nem deleta a linha.

Se eu entendi direito, o código precisa então ficar assim (testei esse código e está funcionando com o resultado.txt fictício que criei):

Código: [Selecionar]
#!/bin/bash
# Limpa o array de itens.
options=()
# Define o nome do arquivo de relatório.
report_file=()
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 os itens de checkbox ao array do menu.
  options+=("$id" "$text" "$status")
done < $report_file

# Exibe o menu em forma de checkbox.
selected=$(dialog --backtitle "Selecione os itens desejados:" --output-fd 1 --scrollbar --separate-output --checklist " " 20 60 15 "${options[@]}")
 
# Executa cada item selecionado.
for item in $selected
do
  if [ "$item" == "1" ] || [ "$item" == "2" ]
  then
    echo "Executando o código para o item $item..."
    sed -i "/ $item/d" $report_file
  fi
done
« Última modificação: 14 de Fevereiro de 2023, 18:17 por Sampayu »
Yuri Sucupira ("Sampayu")

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 496
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube
Re:Ajuda em script con dialog
« Resposta #4 Online: 17 de Fevereiro de 2023, 18:04 »
o arquivo result.txt é um arquivo simples com a seguinte estrutura

Hoje eu criei um arquivo result.txt para testes, com este conteúdo:

Código: [Selecionar]
1 12 13 14 15 16 17 18 19 s1
2 22 23 24 25 26 27 28 29 s2
3 32 33 34 35 36 37 38 39 s3

...e recriei o script com este código:
Código: [Selecionar]
#!/bin/bash
# Limpa o array de itens.
options=()
# Define o nome do arquivo de relatório.
report_file=()
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}')
  blank=""
  status=$(echo $line | awk '{print $10}')
# Adiciona os itens de checkbox ao array do menu.
  options+=("$id" "$blank" "$status")
done < $report_file

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

O código acima faz com que ao lado de cada checkbox do menu apareça somente o id (1, 2 e 3).

Enfim: ambos os códigos funcionaram. Se com qualquer um dos dois códigos que postei aqui eu criar um script e executá-lo (dentro da estrutura de diretórios que você descreveu, i.e. com o script.sh armazenado na pasta-raiz e o arquivo resultado.txt na subpasta ./scripts/hmenu/), em seguida selecionar a opção 2, pressionar a tecla barra de espaço e então pressionar Enter, o conteúdo do arquivo resultado.txt passa a ser este:

Código: [Selecionar]
1 12 13 14 15 16 17 18 19 s1
3 32 33 34 35 36 37 38 39 s3

...que é o que você aparentemente quer que o script faça (i.e. excluir a linha 1 ou a linha 2, caso uma delas seja selecionada na checkbox).
Yuri Sucupira ("Sampayu")