Condicionales y ciclos#

if-then-else-fi#

[1]:
%%bash
#
# En el siguiente ejemplo se codifica la función `min2` la cual recibe dos
# números enteros e imprime el menor de ellos. Si ambos números son iguales,
# se imprimen ambos argumentos. En este ejemplo también se presenta la
# estructura condicional `if`; para que el condicional sea evaluado
# correctamente es necesario colocar la expresión entre `((` y `))`.
#
min2(){
    if (($1 < $2))
    then
        echo $1
    elif (($1 == $2))
    then
        echo $1 $2
    else
        echo $2
    fi
}
min2 1 2
1

case-esac#

[2]:
%%bash
#
# Condicional con case-esac
#
for x in *
do
    case $x in
        *.ipynb) echo -n -e $x ' es un Jupyter notebook\n';;
        *)
    esac
done
01_variables_y_arrays.ipynb  es un Jupyter notebook
02_scripts.ipynb  es un Jupyter notebook
03_funciones.ipynb  es un Jupyter notebook
04_condicionales_y_ciclos.ipynb  es un Jupyter notebook
05_python.ipynb  es un Jupyter notebook

for#

[3]:
%%bash
#
# imprime los números del 1 al 5.
#
for x in 1 2 3 4 5
do
    echo -n $x ''
done
1 2 3 4 5
[4]:
%%bash
#
# El mismo ejemplo anterior.
#
for x in $(seq 1 5)
do
    echo -n $x ''
done
1 2 3 4 5
[5]:
%%bash
#
# De nuevo, el mismo ejemplo anterior
#
for x in {1..5}
do
    echo -n $x ''
done
1 2 3 4 5
[6]:
%%bash
#
# Ciclo for similar al del lenguaje C. Note que la expresión va
# entre '(('  y '))'
#
for ((x=1; x <= 5; x++))
do
  echo -n $x ''
done
1 2 3 4 5
[7]:
%%bash
#
# En el siguiente ejemplo se generarán las cadenas de texto
# `file1.txt`, `file2.txt` ... hasta `file5.txt` usando un ciclo
# `for`. El nombre de la variable debe encerrarse entre `${` y
# `}` para distinguirlo del resto de la cadena de texto. Es decir,
# si se coloca `echo filex.txt` o `echo file$x.txt` el intérprete
# no puede diferenciar el nombre de la variable (`x`) del texto
# restante.
#
for x in {1..5}
do
    echo file${x}.txt
done
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
[8]:
%%bash
#
# De hecho, se pueden generar salidas mucho más complejas, tal como
# se ilustra a continuación (Ok! no se necesita el for para esto,
# pero es para ejemplificar). El for recibe el resultado de ejecutar
# la expresión entre '$('  y  ')'.
#
for x in $(seq -f'file%g.txt' 5)
do
    echo '--->' $x
done
---> file1.txt
---> file2.txt
---> file3.txt
---> file4.txt
---> file5.txt
[9]:
%%bash
#
# En el siguiente ejemplo se genera un conjunto de archivos llamados
#  `out.1`, `out.2`, ..., `out.5`.
#
for x in {1..5}
do
    seq -f'linea %g' 5 > out.${x}
done
ls out.*
out.1
out.2
out.3
out.4
out.5
[10]:
%%bash
#
# A continuación se usa el comando `head` para iterar sobre los archivos
# e imprimir la primera línea de cada uno de ellos.
#
head1(){
    for x in out.*
    do
        head -n 1 $x
    done
}
head1
linea 1
linea 1
linea 1
linea 1
linea 1

while#

[11]:
%%bash
#
# El último ejemplo puede ser realizado usando un ciclo `while` en vez de
# un ciclo `for`. En este caso, el condicional puede ser especificado con
# la palabra clave `test` o colocando el condicional entre `((` y `))`.
#
n=1
while test $n -le 5
do
    echo file${n}.txt
    n=$((n+1))
done
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
[12]:
%%bash
n=1
while (($n <= 5))
do
    echo file${n}.txt
    n=$((n+1))
done
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

until#

[13]:
%%bash
#
# Otra forma alternativa es usar un ciclo `until`.
n=1
until (($n > 5))
do
    echo file${n}.txt
    n=$((n+1))
done
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
[14]:
%%bash
#
# En este ejemplo se crea una función que recibe una lista de enteros
# e imprime el menor de ellos.
#
minimum(){
    n=$1
    for x in $*
    do
        if test $x -lt $n
        then
            n=$x
        fi
    done
    echo $n
}
minimum 6 1 7 5 1 2  5
1