Ajuda em script con dialog

Iniciado por gohan123, 13 de Fevereiro de 2023, 11:59

tópico anterior - próximo tópico

gohan123


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

Sampayu

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:

sed -i "/ $item/d" $report_file

...por:

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:

sed -i "/^\s$item/d" $report_file
Yuri Sucupira ("Sampayu")

gohan123

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

Sampayu

#3
Citação de: gohan123 online 13 de Fevereiro de 2023, 18:02
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):

#!/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
Yuri Sucupira ("Sampayu")

Sampayu

Citação de: gohan123 online 13 de Fevereiro de 2023, 18:02o arquivo result.txt é um arquivo simples com a seguinte estrutura

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

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:
#!/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:

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")