Puis-je modifier le mode d'affichage des options de sélection?

8

Je travaille avec select et case en bash. J'ai actuellement neuf options, ce qui fait une belle grille d'options 3x3, mais elle s'affiche comme suit:

    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

Je préfère qu'il s'affiche dans les lignes avant les colonnes:

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-t-il un moyen d'y parvenir? De préférence, quelque chose de facile à définir et à désactiver dans un script, comme une option shell. Si cela est important, les options sont stockées dans un tableau et référencées dans les blocs de cas par l'index du tableau.

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
la source

Réponses:

7

Créez votre propre "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

Production:

1) afficher tous les éléments 2) ajouter des éléments 3) charger le fichier             
4) écrire dans un fichier 5) générer des lignes 6) effacer un fichier            
7) éléments clairs 8) choisissez le fichier 9) quittez                  
#? 
Cyrus
la source