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

8

Estou trabalhando com select e case no bash. Atualmente, tenho nove opções, o que torna uma grade de opções 3x3 agradável, arrumada, mas é exibida assim:

    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 desfazer dentro de um script, como uma opção de shell. Se for importante, as opções são armazenadas em uma matriz e referenciadas nos blocos de casos 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
    
por user67459 14.05.2015 / 04:42

1 resposta

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

Saída:

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                  
#? 
    
por 14.05.2015 / 09:16