GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit každý výběr nabídky v 1 řádku namísto více výběrů v 1 řádku?

Vytvářím nástrojový skript pro mé téma má 6 možností:
1) Zkontrolujte aktualizaci motivu
2) Přeinstalujte téma
3) Nainstalujte písmo
4) Nainstalujte tapetu
5 ) Zkontrolujte aktualizaci nástroje
6) Ukončete

Zde je kód

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

Ale když to spustím, výběry v nabídce se zkazí

==================
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

Ale co chci, je

===============
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

Jak tedy mohu opravit nabídku?

Přijatá odpověď:

Můžete nastavit COLUMNS proměnnou pro omezení šířky displeje, např. pokud ji nastavíte na 12, zformátuje váš příklad do jednoho sloupce:

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

produkuje

===========================
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
#? 

Manuál bash popisuje COLUMNS:

Používá se select příkaz k určení šířky terminálu při tisku seznamů výběru. Automaticky nastavit, zda checkwinsize možnost je povolena (viz The Shopt Builtin) nebo v interaktivním prostředí po obdržení SIGWINCH .

Kromě zobrazení funkce na manuálové stránce pomáhá přečíst si zdrojový kód, abyste získali celý příběh. Tato proměnná se používá v select_query funkce s komentářem

/* 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. */

a později v select_query funkce

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

Pokud dáte rozumné hodnota, atoi dává rozumné výsledky (i nula v tomto případě by byla věrohodná, protože to je méně více než 80 sloupců a vrátí jej atoi pokud nastavíte COLUMNS na nenumerickou hodnotu). Pokud není uvedena žádná hodnota, (tj. COLUMNS="" ), bash používá 80 sloupců.

Související:Bash:Shift+šipky vytvoří A,B,C,D?

Další čtení:

  • atoi – převede řetězec na celé číslo

    Volání atoi(str) musí být ekvivalentní:
    (int) strtol(str, (char **)NULL, 10)

  • strtol, strtoll – převod řetězce na dlouhé celé číslo

    Pokud nelze provést konverzi, vrátí se 0


Linux
  1. Jak vložit text na začátek každého řádku ve Vimu

  2. Jak připojit více řádků k souboru?

  3. Jak analyzovat každý řádek textového souboru jako argument příkazu?

  1. Jak napsat víceřádkový řetězec pomocí Bash s proměnnými?

  2. Jak přimět GREP, aby vybral pouze číselné hodnoty?

  3. Jak získat prvních n znaků každého řádku v unixovém datovém souboru

  1. Jak vložit mezeru každé čtyři znaky do dlouhého řádku?

  2. Jak tisknout názvy linuxových skupin na více řádcích namísto jednořádkového výstupu

  3. Jak mohu vytvořit více adresářů najednou v adresáři?