GNU/Linux >> Tutoriels Linux >  >> Linux

Comment faire chaque sélection de menu sur 1 ligne au lieu de plusieurs sélections sur 1 ligne ?

Je crée un script d'outil pour mon thème a 6 options :
1) Vérifier la mise à jour du thème
2) Réinstaller le thème
3) Installer la police
4) Installer le fond d'écran
5 ) Vérifier la mise à jour de l'outil
6) Quitter

Voici le 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

Mais quand je l'exécute, les sélections du menu se gâtent

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

Mais ce que je veux, c'est

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

Alors, comment puis-je réparer le menu ?

Réponse acceptée :

Vous pouvez définir les COLUMNS variable pour limiter la largeur de l'affichage, par exemple, si vous la définissez sur 12, elle formatera votre exemple en une seule colonne :

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

produit

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

Le manuel bash décrit les COLONNES :

Utilisé par le select commande pour déterminer la largeur du terminal lors de l'impression des listes de sélection. Défini automatiquement si le checkwinsize est activée (voir The Shopt Builtin), ou dans un shell interactif à la réception d'un SIGWINCH .

En plus de voir la fonctionnalité dans la page de manuel, il est utile de lire le code source pour obtenir l'histoire complète. Cette variable est utilisée dans le select_query fonction, avec le commentaire

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

et plus tard, dans le select_query fonction

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

Si vous donnez un raisonnable valeur, atoi donne des résultats raisonnables (même zéro dans ce cas serait plausible, puisque c'est moins plus de 80 colonnes, et serait renvoyé par atoi si vous définissez COLUMNS à une valeur non numérique). S'il n'y a pas de valeur, (c'est-à-dire COLUMNS="" ), bash utilise 80 colonnes.

Connexes :Bash :les touches Maj + flèches font A, B, C, D ?

Lectures complémentaires :

  • atoi – convertir une chaîne en entier

    L'appel atoi(str) doit être équivalent à :
    (int) strtol(str, (char **)NULL, 10)

  • strtol, strtoll – convertir une chaîne en entier long

    Si aucune conversion n'a pu être effectuée, 0 sera retourné


Linux
  1. Comment insérer du texte au début de chaque ligne dans Vim

  2. Comment ajouter plusieurs lignes à un fichier ?

  3. Comment analyser chaque ligne d'un fichier texte comme argument d'une commande ?

  4. Comment puis-je faire en sorte que grep imprime les lignes en dessous et au-dessus de chaque ligne correspondante?

  5. Comment imprimer les noms de groupe Linux sur plusieurs lignes au lieu d'une sortie sur une seule ligne

Comment faire ressembler KDE à GNOME sous Linux

Comment commenter plusieurs lignes à la fois dans l'éditeur Vim

Comment supprimer plusieurs lignes dans Vim

Comment obtenir les n premiers caractères de chaque ligne dans le fichier de données Unix

Comment modifier les lignes précédentes dans une commande à plusieurs lignes dans Bash ?

Comment faire en sorte que la commande grep renvoie toute la ligne correspondante