Bash - Como fazer cada seleção de menu em uma linha em vez de várias seleções em uma linha

2

Im fazendo um script de ferramenta para o meu tema tem 6 opções: 1) Verifique a atualização do tema 2) Reinstale o tema 3) Instalar fonte 4) Instalar papel de parede 5) Verifique a atualização da ferramenta 6) Saia

Aqui está o código

clear
echo "==========================="
echo "Tool for theme"
echo "==========================="

function check_update {
echo "checking theme update"
}

function reinstall_theme {
echo "Reinstalling"
echo "==========================="
}

function font {
echo "Installing font"
}

function wall {
echo "Installing wallpaper"
}

function check_update_tool {
echo "Checking tool update"
}

all_done=0
while (( !all_done )); do
options=("Check theme update" "Reinstall theme" "Install font" "Install wallpaper" "Check tool update" "Quit")

echo "Choose an option: "
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac
done
done

echo "Exiting"
sleep 2

Mas quando eu o executo, as seleções do menu estragam

==================
Tool for theme
==================
Choose an option:
1) Check theme update 2) Reinstall theme  3) Install font
4) Install Wallpaper     5) Check tool update      6) Quit

Mas o que eu quero é

===============
Tool for theme
===============
Choose an option:
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit

Então, como posso corrigir o menu?

    
por superquanganh 03.07.2016 / 17:13

1 resposta

7

Você pode definir a variável COLUMNS para limitar a largura da exibição. Por exemplo, se você defini-la como 12, ela formatará seu exemplo em uma única coluna:

COLUMNS=12
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac

produz

===========================
Tool for theme
===========================
Choose an option: 
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit
#? 

O manual do bash descreve COLUMNS:

Used by the select command to determine the terminal width when printing selection lists. Automatically set if the checkwinsize option is enabled (see The Shopt Builtin), or in an interactive shell upon receipt of a SIGWINCH.

Além de ver o recurso na página de manual, é útil ler o código-fonte para obter a história completa. Essa variável é usada na função select_query , com o comentário

/* Print the elements of LIST, one per line, preceded by an index from 1 to
   LIST_LEN.  Then display PROMPT and wait for the user to enter a number.
   If the number is between 1 and LIST_LEN, return that selection.  If EOF
   is read, return a null string.  If a blank line is entered, or an invalid
   number is entered, the loop is executed again. */

e mais tarde, na % funçãoselect_query

  t = get_string_value ("COLUMNS");
  COLS =  (t && *t) ? atoi (t) : 80;

Se você der um valor razoável , atoi dará resultados razoáveis (até mesmo zero, neste caso, seria plausível, já que isso é menos de 80 colunas, e ser retornado por atoi se você definir COLUMNS para um valor não numérico). Se não houver valor, (por exemplo, COLUMNS="" ), bash usará 80 colunas.

Leitura adicional:

por 03.07.2016 / 17:26

Tags