Могу ли я изменить способ отображения выбранных параметров?


8

Я работаю с select и case в bash. В настоящее время у меня есть девять опций, которые создают красивую, аккуратную сетку опций 3х3, но она выглядит так:

    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

Я бы предпочел, чтобы он отображался в строках перед столбцами:

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

Есть ли способ сделать это? Желательно что-то, что легко установить и отключить в скрипте, например, параметр оболочки. Если это имеет значение, параметры сохраняются в массиве и на них ссылаются в блоках case по индексу массива.

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

Ответы:


7

Создайте свой собственный «выбор»:

#!/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

Вывод:

1) показать все элементы 2) добавить элементы 3) загрузить файл             
4) запись в файл 5) генерация строк 6) очистка файла            
7) очистить элементы 8) выбрать файл 9) выйти                  
#? 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.