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, zdacheckwinsize
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ů.
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