Você está procurando dialog
. É uma ferramenta muito poderosa e usa ncurses
para fornecer muitas opções. Eu sugiro que você leia sua manpage. Especificamente, você quer a opção --menu
:
--menu text height width menu-height [ tag item ] ...
As its name suggests, a menu box is a dialog box that can be
used to present a list of choices in the form of a menu for the
user to choose. Choices are displayed in the order given. Each
menu entry consists of a tag string and an item string. The tag
gives the entry a name to distinguish it from the other entries
in the menu. The item is a short description of the option that
the entry represents. The user can move between the menu en‐
tries by pressing the cursor keys, the first letter of the tag
as a hot-key, or the number keys 1-9. There are menu-height en‐
tries displayed in the menu at one time, but the menu will be
scrolled if there are more entries than that.
On exit the tag of the chosen menu entry will be printed on dia‐
log's output. If the "--help-button" option is given, the cor‐
responding help text will be printed if the user selects the
help button.
Infelizmente, implementá-lo de maneira sã usando a saída de um comando que contém espaços é bastante complexo devido a vários problemas de cotação. De qualquer forma, eu não consegui fazer isso, e tive que recorrer ao uso de eval
. No entanto, funciona e faz o que você pediu:
#!/usr/bin/env bash
tmp=$(mktemp)
IFS=
eval dialog --menu \"Please choose a filesystem:\" 50 50 10 $(lsblk -f | sed -r 's/^/"/;s/$/" " "/' | tr $'\n' ' ') 2>$tmp
D=$(tr -d '│├└─' < $tmp | sed 's/^[ \t]*//' | cut -d' ' -f1)
printf "You chose:\n%s\n" "$D"
Para uma abordagem mais portátil, altere o comando grep
para
O sed
apenas formata a saída de lsblk
para que haja cotações em torno de cada linha de saída (a "tag" do diálogo), seguida por um espaço entre aspas (o "item" da caixa de diálogo) e tr
substitui novas linhas com espaços e os caracteres das partes da árvore.
O resultado é assim:
┌────────────────────────────────────────────────┐
│ Please choose a filesystem: │
│ ┌────────────────────────────────────────────┐ │
│ │ NAME FSTYPE LABEL MOUNTPOINT │ │
│ │ sda │ │
│ │ ├─sda1 │ │
│ │ ├─sda2 │ │
│ │ ├─sda3 /winblows │ │
│ │ ├─sda4 │ │
│ │ ├─sda5 │ │
│ │ ├─sda6 /home │ │
│ │ ├─sda7 / │ │
│ │ └─sda8 [SWAP] │ │
│ └────↓(+)────────────────────────────90%─────┘ │
│ │
├────────────────────────────────────────────────┤
│ < OK > <Cancel> │
└────────────────────────────────────────────────┘