Programando en Bash – parte 2

Segunda parte de este mini-tutorial de programación en Bash, donde aprendemos a usar ciclos y otras herramientas que nos ayudarán a mejorar las funcionalidades de nuestros scripts.

El condicional If

La función de If es la de aplicar un filtro y realizar una operación o tarea para cada tipo de filtro aplicado. Su estructura es la siguiente:

If [ condición ]; then
 comandos
elif [ condición ]; then
 comandos
else; 
 comandos
fi

Se muestra un ejemplo junto al ciclo For en su respectiva sección.

Ciclos

1. While: ejecutará todos los comandos especificados entre do y done mientras la condición sea verdadera. Si queremos pasarle operadores de comparación, la expresión deberá encontrarse entre corchetes.

while CONDICIÓN/COMANDO
do
 comandos
done

Ejemplo: tabla de multiplicar de un número

#!/bin/bash
X=1
echo “Ingresa un número y presiona ENTER”
read M
#El ciclo controla que X sea menor o igual a 10
while [ $X –le 10 ]
do
 #En R almacenamos la multiplicación de X por M
 R=$[X*M]
 #Se imprime dicha multiplicación en pantalla
 echo “$M * $X= $R”
 #Con let, incrementamos el valor de X en 1 unidad
 let X=$X+1
done

2. For: almacena una lista de elementos en una variable, la cual será usada para realizar ciertas operaciones con cada ciclo.

for VARIABLE in ELEMENTOS
do
 comandos
done

Ejemplo: programa que copia un archivo de una carpeta hacia otra, reemplazando un archivo viejo.

#/bin/bash
#Establecemos directorios de origen y destino
ORIGEN=/home/usuario/Descargas
DESTINO=/home/usuario/Documentos
#Nos posicionamos en el de origen
cd $ORIGEN
#De todos los archivos, solo queremos aquel que se #llame ARCHIVO
for ARCHIVO in *
do
 ARCH-DESTINO= “$DESTINO/$ARCHIVO”
 # -f nos filtra los archivos regulares, ya que de  
#nada nos sirven los directorios. –nt nos filtra 
#los archivos “más nuevos” que aquellos 
#encontrados en la carpeta destino
 if [ -f $ARCHIVO ] && [ $ARCHIVO –nt $ARCH-DESTINO ]; then
     echo “Copiando $ARCHIVO…”
     #copiamos el archive con cp
     cp $ARCHIVO $ARCH-DESTINO
 fi
done
#Hacemos cd para salir de la carpeta de origen
cd

Otro ejemplo: script donde el usuario debe adivinar un número al azar generado por la computadora.

#/bin/bash
#Se genera un número aleatorio del 1 al 10, se lo #guarda en AZAR
AZAR=$[$RANDOM%10+1]
while [ 1 ]
do
 echo –n “Ingrese un numero: “
 read NUM
#Compara si el número elegido por el usuario es #igual a AZAR; recordemos usar $ para evaluar los #valores de las variables y no sus nombres
 if [ “$NUM –eq “$AZAR” ]; then
     echo “Acertaste!”
     #break permite finalizar el ciclo while
     break
 #Si el número es menor a AZAR
 elif [ “$NUM –gt “$AZAR” ]; then
     echo “Es menor”
     “Sino, es más grande que AZAR
 else
     echo “ES mayor”
 fi
done

3. Until: bastante similar en estructura al While, except que el código siempre se ejecuta mientras la evaluación de la condición sea negativa, es decir, el programa sigue ejecutándose “hasta que sucede la condición”

until CONDICIÓN/COMANDO
do
 comandos
done

Ejemplo: imprimir los números del 10 al 20 en orden descendente

#!/bin/bash 
CONT=20
#Mientras el contador sea menor que 10 (-lt, “lower #than”) se ejecuta el código
until [  $CONT -lt 10 ]; do
     echo “CONTADOR $CONT”
     #A CONT se le resta una unidad
     let CONT-=1
done

4. Select: este último ciclo es un caso especial, ya que es usado generalmente para realizar menúes de forma rápida. Trabaja de forma similar al ciclo For.

select VARIABLE in LISTA
do
    comandos
done

Ejemplo: darle al usuario la posibilidad de continuar o finalizar el script.

#!/bin/bash
#item es una variable que responde a lo que el 
#usuario elige, Continuar y Finalizar son las 
#opciones que tiene disponible, aunque pueden ser 
#agregadas otras más

select item in Continuar Finalizar
do
#Si el usuario elige finalizar el programa, entonces con break salimos del ciclo.
    if [ $item = "Finalizar" ]; then
        break
    fi
done
¡Gracias Juan Carlos Ortiz!


13 comentarios

  1.   Miguel Angel dijo

    Hola, buen tuto, estoy aprendiendo acerca del tema y todo bien, solo que no he podido hacer un programa que me ayude, a ver si me puedes ayudar por favor.

    Necesito hacer un ciclo, en cual recibirá como parametros una lista de un archivo origen, dicha lista solo trae nombres (sin extension), entonces que el ciclo haga lo sig, busque dicho nombre recibido en un directorio (que es en el que buscaremos), extraiga y copie el archivo (nombre completo ya con extension) y la ruta absoluta y me lo cree en otro archivo destino.

    Hasta el momento tengo lo sig:

    while read line
    do
    echo -e “$line”
    find /home/miusuario/dde “$line” -exec readlink -f {} ;
    done < listaprueba.txt Hasta el momento leo el archivo, cada linea que tiene, pero no logro hacer que busque ese archivo y me extraiga la informacion, si me puedes ayudar por favor, gracias. Saludos

  2.   Pamela Galaviz dijo

    Muchas gracias por el aporte 🙂

  3.   Medio Dificil dijo

    Creo que algo así: tar -cf – Directorio | (cd /otro/directorio ; tar -xvf -)

    Entonces quedaría así /otro/directorio/Directorio
    De esa manera comprimí un Directorio y lo descomprimís en otro lugar….

  4.   Mario Javier dijo

    hola… espero puedas ayudar en la siguiente practica… Descomprimir archivo en tgz en el directorio especificado, ademas de especificar usuario y grupo para todos los directorios y archivos existentes, y asignar permisos a los archivos y directorios
    nota: archivos premisos de lectura y escritura
    directorios permiso de ejecucion

  5.   Juank dijo

    ARCH-DESTINO es una variable en la cual queremos guardar la ruta del archivo destino, valga la redundancia. Entonces, a dicha variable le indicamos la variable DESTINO, que más arriba contiene la ruta hasta la carpeta Documentos y le agregamos la “variable” ARCHIVO, que contiene el nombre del archivo. Si ese archivo fuera, por ejemplo, listado.doc, la variable ARCH-DESTINO sería igual a /home/Usuario/Documentos/listado.doc

  6.   Usemos Linux dijo

    Es el articulo anterior. Podes acceder a el en http://usemoslinux.blogspot.com

    Abrazo! Pablo.

  7.   Frank dijo

    Buenos días compañero simplemente gracias , muy bueno su blog , pero no consigo la primera parte de Programando en Bash , donde la consigo gracias , saludos

  8.   Saito Mordraug dijo

    Dos partes extraordinarias, mis sinceras felicitaciones.

    Simplemente maravilloso.

  9.   Fredy dijo

    Bien

  10.   Hugo dijo

    Hola estoy haciendo un programa con un CASE, lo que quiero que haga y no se como es que por ejemplo:

    echo Seleciones una opción:
    echo
    echo 1. opcion 1
    echo 2. opcion 2
    echo 3. opcion 3
    echo 4. opcion 4
    echo 5. Salir
    read var
    case “$var” in
    1)
    echo “Seleccionaste opcion 1”
    ;;
    2)
    echo “Selecionaste opcion 2”
    ;;
    3)
    echo “…..”
    ;;
    4)
    echo “….”
    ;;
    5)
    echo “…”

    ;;
    *)
    echo “opcion erronea”
    ;;
    esac

    ok lo que no se como se hace es que cuando seleccione opcion 4 que es salir, pregunte si en verdad deseo salir, y me de 2 opciones S & N

    y la otra es que cuando seleccione ootra cosa que no sean los numeros del 1..5 no me vote del script….

    Me podrian ayudar gracias.

  11.   DAPAMA21 dijo

    Hola, he empezado hace 1 mes a hacer scripts y gracias a tus publicaciones de script. habre hecho unos 15-20. De antemano, muchisimas gracias. Pero ahora nos ha metido nuestro profesor un trabajo del cual me he quedado estancado. Ya que el profesor pide:
    pasando un directorio, copia en tu home todos los archivos que haya en ese directorio alfabeticamente y nombrandoles archivo1 archivo2 etc..etc…
    ahora estoy en el momento de find o locate, queria utilizar el find pero al darle codigo de error como lo meto por dev null los de permisos denegado entonces me sale mal y poniendo el locate estoy por aqui:
    locate $1 | grep “/${1}\$”
    pero claro con esto me salen todos…
    Muchas gracias si lo lees.
    Si puedes ayudarme seria un gran favor.

  12.   luis dijo

    quisiera que me ayude en esto.
    1.-Ingresar un número entero por teclado y muestre por pantalla el doble y el triple de ese número. 2.- Hacer un programa para decidir si un número ingresado por teclado es divisible por 3 o no.
    3.- Hacer un programa para encontrar la suma de: ????????+????????+????????+????????+⋯????????
    4.- Hacer un programa para encontrar la suma 1 + 3 + 5 + 7 + 9 · · · + (2n + 1).
    5.-Realizar un programa que imprima en pantalla la palabra Linux 10 veces
    6.-Realizar un programa que imprima en pantalla la palabra Linux el número de veces indicada por un usuario.
    7.-Ingresar una cantidad en horas y convertirlas a minutos y segundos.
    8.-Calcular el área de un triángulo
    9.-Ingresar un número por teclado, luego si se ingresa 2 se debe elevar al cuadrado, 3 se eleva al cubo, 4 a la cuarta y así sucesivamente hasta 6.
    10-Calcular la pensión que debe pagar un alumno, se debe ingresar el código de la especialidad, y los días de mora:
    CODIGO
    ESPECIALIDAD
    MONTO
    MORA POR DIA
    1
    COMPUTACION
    160
    1
    2
    ENFERMERIA
    150
    1.5
    3
    SECRETARIADO
    140
    2
    4
    TURISMO
    180
    2.5
    5
    CONTABILIDAD
    160
    1
    Se debe mostrar la especialidad que estudia, el costo de la pensión, la mora y el monto total a pagar.

  13.   charly dijo

    Hola, puede alguien ayudarme?
    Necesito “Pedir tres palabras por teclado y visualizarlas por orden alfabetice de la A a la z”
    En lenguaje Bash o sh para LINUX porfaborrrr

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.