Wenn ich ein Tool-Skript für mein Design erstelle, gibt es 6 Optionen:
1) Design-Update prüfen
2) Design neu installieren
3) Schriftart installieren
4) Hintergrundbild installieren
5 ) Tool-Update prüfen
6) Beenden
Hier ist der Code
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
Aber wenn ich es starte, kommt die Menüauswahl durcheinander
==================
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
Aber was ich will, ist
===============
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
Wie kann ich also das Menü reparieren?
Akzeptierte Antwort:
Sie können die COLUMNS
festlegen Variable, um die Breite der Anzeige zu begrenzen, z. B. wenn Sie sie auf 12 setzen, wird sie Ihr Beispiel in eine einzelne Spalte formatieren:
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
produziert
===========================
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
#?
Das Bash-Handbuch beschreibt COLUMNS:
Wird von select
verwendet Befehl zur Bestimmung der Klemmenbreite beim Drucken von Auswahllisten. Wird automatisch gesetzt, wenn checkwinsize
Option aktiviert ist (siehe The Shopt Builtin), oder in einer interaktiven Shell nach Erhalt eines SIGWINCH
.
Abgesehen davon, dass Sie die Funktion in der Handbuchseite sehen, hilft es, den Quellcode zu lesen, um die vollständige Geschichte zu erhalten. Diese Variable wird in select_query
verwendet Funktion, mit dem Kommentar
/* 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. */
und später in select_query
Funktion
t = get_string_value ("COLUMNS"); COLS = (t && *t) ? atoi (t) : 80;
Wenn Sie eine angemessene Angabe machen Wert, atoi
ergibt vernünftige Ergebnisse (sogar Null wäre in diesem Fall plausibel, da das weniger ist als 80 Spalten und würde von atoi
zurückgegeben werden wenn Sie COLUMNS
setzen auf einen nicht numerischen Wert). Wenn es keinen Wert gibt (d. h. COLUMNS=""
), bash
verwendet 80 Spalten.
Weiterführende Literatur:
- atoi – konvertiert einen String in eine ganze Zahl
Der Aufruf atoi(str) soll äquivalent sein zu:
(int) strtol(str, (char **)NULL, 10)
- strtol, strtoll – konvertiert einen String in eine lange Ganzzahl
Wenn keine Konvertierung durchgeführt werden konnte, wird 0 zurückgegeben