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