Como gerar menu dinâmico e torná-lo utilizável?

1

Estou tentando criar um script que gere o menu com nomes de arquivos armazenados em uma pasta específica e, em seguida, permita-me imprimir o conteúdo desse arquivo com cat depois de inserir o número atribuído a esse arquivo. O loop que fiz funciona perfeitamente em termos de geração de menu, mas não sei como definir variáveis automaticamente e usá-las para imprimir o conteúdo desses arquivos ou gerar estrutura de casos (não sei qual abordagem é melhor nessa situação). Meu loop é assim:

number=1
for file in ./menus/*; do
  echo "$number)" 'basename -s .sh "$file"'
  let "number += 1"
done
    
por s-kaczmarek 11.12.2016 / 15:34

2 respostas

-1

Em vez de instruções case / if complicadas, você pode criar um truque e usar uma matriz para armazenar nomes de arquivos e, em seguida, apenas chamar o arquivo necessário usando seu índice de matriz:

number=1
for file in ./menus/*; do
fnames+=($(basename -s .sh $file))
#OR just fnames+=( $file )
echo "$number)" 'basename -s .sh "$file"'
let "number += 1"
done
read -p "select a file id" fid
fid=$(($fid-1)) # reduce user input by 1 since array starts counting from zero
cat "${fnames[$fid]}.sh" # or just cat "${fnames[$fid]}" 

Você também pode fazer seu trabalho com uma interface gráfica agradável usando o Yad (um fork avançado do Zenity) como abaixo.
Neste caso, você não precisa de numeração - basta selecionar o arquivo em uma lista de GUIs e pressionar enter ou clicar em ok você gata o arquivo selecionado e pode ver o conteúdo em uma nova janela yad.

Como um comando de linha única no bash (para teste):

fc=$(basename -s .sh $(find . -name "*.sh") |yad --list --width=500 --height=500 --center --column="File" --separator="") && cat $fc.sh |yad --text-info --width=800 --height=300

Como um script:

yadb=0
while [ $yadb -eq "0" ];do 
    fc=$(basename -s .sh $(find . -name "*.sh") |yad --list --width=500 --height=500 --center --column="File" --separator="")
    yadb=$?
    if [ $yadb -eq "0" ]; then 
       cat $fc.sh |yad --text-info --width=800 --height=300
    fi
    # If you press cancel on yad window , then yadb will become 1 , file will not be displayed and while loop will be ended.
done
    
por 11.12.2016 / 16:06
2

Use dialog para isso ...

apt-get install dialog

Exemplo:

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
BACKTITLE="Backtitle here"
TITLE="Title here"
MENU="Choose one of the following options:"

OPTIONS=(1 "Option 1"
         2 "Option 2"
         3 "Option 3")

CHOICE=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            echo "You chose Option 1"
            ;;
        2)
            echo "You chose Option 2"
            ;;
        3)
            echo "You chose Option 3"
            ;;
esac
    
por 11.12.2016 / 17:15

Tags