Posso alterar como as opções selecionadas são exibidas?

8

Estou trabalhando com select e case no bash. Atualmente, tenho nove opções, o que cria uma grade de opções agradável e organizada em 3x3, mas é exibida da seguinte forma:

    1) show all elements  4) write to file      7) clear elements
    2) add elements       5) generate lines     8) choose file
    3) load file          6) clear file         9) exit

Prefiro que seja exibido em linhas antes de colunas:

1) show all elements  2) add elements    3) load file
4) write to file      5) generate lines  6) clear file  
7) clear elements     8) choose file     9) exit

Existe alguma maneira de conseguir isso? De preferência, algo fácil de configurar e desarmar em um script, como uma opção de shell. Se isso importa, as opções são armazenadas em uma matriz e referenciadas nos blocos de caso pelo índice da matriz.

OPTIONS=("show all elements" "add elements" "load file" "write to file" "generate lines" "clear file" "clear elements" "choose file" "exit")

...

select opt in "${OPTIONS[@]}"
do
case $opt in
    "${OPTIONS[0]}")

...

    "${OPTIONS[8]}")
        echo "Bye bye!"
        exit 0
        break
        ;;

    *)
        echo "Please enter a valid option."
esac
done
user67459
fonte

Respostas:

7

Crie seu próprio "select":

#!/bin/bash

options=("show all elements" "add elements" "load file" "write to file" "generate lines" "clear file" "clear elements" "choose file" "exit")
width=25
cols=3

for ((i=0;i<${#options[@]};i++)); do 
  string="$(($i+1))) ${options[$i]}"
  printf "%s" "$string"
  printf "%$(($width-${#string}))s" " "
  [[ $(((i+1)%$cols)) -eq 0 ]] && echo
done

while true; do
  echo
  read -p '#? ' opt
  case $opt in
    1)
      echo "${options[$opt-1]}"
      ;;

    2)
      echo "${options[$opt-1]}"
      ;;

    9)
      echo "Bye bye!"
      break
      ;;
  esac
done

Resultado:

1) mostrar todos os elementos 2) adicionar elementos 3) carregar arquivo             
4) escreva no arquivo 5) gere linhas 6) apague o arquivo            
7) elementos claros 8) escolha o arquivo 9) saia                  
#? 
Cyrus
fonte