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 lecheckwinsize
est activée (voir The Shopt Builtin), ou dans un shell interactif à la réception d'unSIGWINCH
.
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.
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é