Estoy creando un script de herramientas para mi tema que tiene 6 opciones:
1) Verificar la actualización del tema
2) Reinstalar el tema
3) Instalar la fuente
4) Instalar el fondo de pantalla
5 ) Comprobar la actualización de la herramienta
6) Salir
Aquí está el código
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
Pero cuando lo ejecuto, las selecciones del menú fallan
==================
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
Pero lo que quiero es
===============
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
Entonces, ¿cómo puedo arreglar el menú?
Respuesta aceptada:
Puede configurar las COLUMNS
variable para limitar el ancho de la pantalla, por ejemplo, si lo establece en 12, formateará su ejemplo en una sola columna:
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
produce
===========================
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
#?
El manual de bash describe COLUMNAS:
Usado por select
Comando para determinar el ancho del terminal al imprimir listas de selección. Establecer automáticamente si checkwinsize
está habilitada (ver The Shopt Builtin), o en un shell interactivo al recibir un SIGWINCH
.
Además de ver la función en la página del manual, ayuda leer el código fuente para obtener la historia completa. Esta variable se usa en select_query
función, con el comentario
/* 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. */
y más tarde, en el select_query
función
t = get_string_value ("COLUMNS"); COLS = (t && *t) ? atoi (t) : 80;
Si das un razonable valor, atoi
da resultados razonables (incluso cero en este caso sería plausible, ya que eso es menos de 80 columnas, y sería devuelto por atoi
si establece COLUMNS
a un valor no numérico). Si no hay valor, (es decir, COLUMNS=""
), bash
usa 80 columnas.
Lectura adicional:
- atoi:convierte una cadena en un número entero
La llamada atoi(str) será equivalente a:
(int) strtol(str, (char **)NULL, 10)
- strtol, strtoll:convierte una cadena en un entero largo
Si no se pudo realizar ninguna conversión, se devolverá 0