¿Puedo cambiar cómo se muestran las opciones de selección?

8

Estoy trabajando con select y case en bash. Actualmente tengo nueve opciones, lo que hace una cuadrícula de opciones agradable, ordenada, 3x3, pero se muestra así:

    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

Prefiero que se muestre en filas antes de columnas:

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

¿Hay alguna forma de lograr esto? Preferiblemente algo fácil de configurar y desarmar dentro de un script, como una opción de shell. Si es importante, las opciones se almacenan en una matriz y se hace referencia en los bloques de casos por el índice de la 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
usuario67459
fuente

Respuestas:

7

Crea tu propio "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

Salida:

1) muestra todos los elementos 2) agrega elementos 3) carga el archivo             
4) escribir en el archivo 5) generar líneas 6) borrar archivo            
7) borrar elementos 8) elegir archivo 9) salir                  
#? 
Ciro
fuente