miércoles, 5 de abril de 2017

while

bash puede expresar una idea similar. Digamos que queremos mostrar cinco números en orden secuencial desde el uno al cinco. Un script de bash podría construirse de la siguiente forma:

#!/bin/bash

# while-count: display a series of numbers

count=1

while [[ $count -le 5 ]]; do
     echo $count
     count=$((count + 1))
done
echo "Finished."

Cuando se ejecuta, este script muestra lo siguiente:

[me@linuxbox ~]$ while-count
1
2
3
4
5
Finished.

La sintaxis del comando while es:

while comandos; do comandos; done

Al igual que if, while evalúa el estado de salida de una lista de comandos. Mientras que el estado de salida sea cero, ejecuta los comandos dentro del bucle. En el script anterior, se crea la variable count y se le asigna un valor inicial de 1. El comando while evalúa el estado de salida del comando test. Mientras el comando test devuelva un estado de salida cero, los comandos dentro del bucle se ejecutan. Al final de cada ciclo, se repite el comando test. Tras seis iteraciones del bucle, el valor de count se ha incrementado hasta 6, el comando test ya no devuelve un estado de salida de cero y el bucle termina. El programa continúa con la siguiente línea a continuación del bucle.

Podemos usar un bucle while para mejorar el programa read-menu del capítulo anterior:

#!/bin/bash

# while-menu: a menu driven system information program

DELAY=3 # Number of seconds to display results

while [[ $REPLY != 0 ]]; do
    clear
    cat <<- _EOF_
        Please Select:

        1. Display System Information
        2. Display Disk Space
        3. Display Home Space Utilization
        0. Quit

    _EOF_
    read -p "Enter selection [0-3] > "

    if [[ $REPLY =~ ^[0-3]$ ]]; then
        if [[ $REPLY == 1 ]]; then
            echo "Hostname: $HOSTNAME"
             uptime
             sleep $DELAY
        fi
        if [[ $REPLY == 2 ]]; then
            df -h
            sleep $DELAY
        fi
        if [[ $REPLY == 3 ]]; then
            if [[ $(id -u) -eq 0 ]]; then
                echo "Home Space Utilization (All Users)"
                du -sh /home/*
            else
                echo "Home Space Utilization ($USER)"
                du -sh $HOME
            fi
            sleep $DELAY
        fi
    else
        echo "Invalid entry."
        sleep $DELAY
    fi
done
echo "Program terminated."

Englobando el menú en un bucle while, podemos hacer que el programa repita la pantalla de menú tras cada selección. El bucle continua mientras que REPLY no sea igual a "0" y el menú se muestra de nuevo, dando al usuario la oportunidad de realizar otra selección. Al final de cada acción, se ejecuta un comando sleep de forma que el programa espera unos segundos para permitir que el resultado de la selección se vea antes de borrar la pantalla y volver a mostrar el menú. Una vez que REPLY es igual a "0", que indica la selección de "quit", termina el bucle y continúa la ejecución con la línea siguiente a done.

No hay comentarios:

Publicar un comentario