GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man jede Menüauswahl in 1 Zeile anstelle von Mehrfachauswahlen in 1 Zeile treffen?

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.

Verwandte:Bash:Umschalt + Pfeiltasten machen A, B, C, D?

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


Linux
  1. Wie kann ich grep die Zeilen unter und über jeder übereinstimmenden Zeile drucken lassen?

  2. Wie schreibe ich eine mehrzeilige Zeichenfolge mit Bash mit Variablen?

  3. Wie kann man GREP dazu bringen, nur numerische Werte auszuwählen?

  4. Linux-Befehlszeile:du --- wie man dafür sorgt, dass nur die Summe für jedes Verzeichnis angezeigt wird

  5. So drucken Sie Linux-Gruppennamen in mehreren Zeilen anstelle einer einzeiligen Ausgabe

Wie man KDE unter Linux wie GNOME aussehen lässt

So kommentieren Sie mehrere Zeilen gleichzeitig im Vim-Editor aus

Wie füge ich alle vier Zeichen in einer langen Zeile ein Leerzeichen ein?

So löschen Sie mehrere Zeilen in Vim

So erhalten Sie die ersten n Zeichen jeder Zeile in einer Unix-Datendatei

Wie bearbeite ich vorherige Zeilen in einem mehrzeiligen Befehl in Bash?