GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer cada selección de menú en 1 línea en lugar de selecciones múltiples en 1 línea?

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.

Relacionado:Bash:Shift+teclas de flecha hacen A,B,C,D?

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


Linux
  1. ¿Cómo agregar varias líneas a un archivo?

  2. ¿Cómo analizar cada línea de un archivo de texto como un argumento para un comando?

  3. ¿Cómo puedo hacer que grep imprima las líneas debajo y encima de cada línea coincidente?

  4. ¿Cómo escribir una cadena de varias líneas usando Bash con variables?

  5. ¿Cómo hacer que GREP seleccione solo valores numéricos?

Cómo hacer que KDE se parezca a GNOME en Linux

Cómo comentar varias líneas a la vez en Vim Editor

Cómo eliminar varias líneas en Vim

línea de comando de Linux:du --- cómo hacer que muestre solo el total para cada directorio

Cómo obtener los primeros n caracteres de cada línea en un archivo de datos de Unix

¿Cómo edito líneas anteriores en un comando de varias líneas en Bash?