Ut4 Script Linux
Ut4 Script Linux
INTRODUCCIÓN:
Los programas shell (Guiones del Shell, guiones, programas Shell, Shell Scripts o Scripts) son un conjunto de
órdenes del shell escritas en un fichero ordinario de Linux en formato texto puro que son interpretadas por el
núcleo del sistema. Los scripts son muy potentes y eficaces, entre sus características podemos incluir:
• Interpretado.
• Permite programación estructurada.
• Interactivo (read, echo)
• Sentencias de Control de flujo del programa (If..., Case..., While..., Until..., For......)
• Tratamiento y operaciones con Variables del Sistema y de Usuario.
• Uso de argumentos de entrada.
• Funciones.
• Sintaxis compleja.
• Poca capacidad para cálculo numérico (no están diseñados para este uso).
Para crear un Guión solo es necesario disponer de un Editor que disponga de modo texto puro como es el caso de
nano, gedit o vi. Si estamos trabajando desde un terminal en red se puede usar un editor externo desde otro
S.Operativo (Windows por ejemplo) y transferir el fichero vía FTP o usar las opciones copiar-pegar.
En la primera línea del script se debe indicar qué shell vas a usar ( /bin/bash/ , /usr/ bin/perl ,
etc) Aunque da igual la que uses lo importante es el contenido:
#! /bin/bash
Se denomina “sha-bang” a la secuencia #! con la que se inician los scripts. Su función es indicarle al
sistema que se trata de un conjunto de comandos para que sean interpretados. En realidad, es un número
mágico de dos bytes. El número mágico es un marcador especial para indicar el tipo de archivo, en este
caso, indica que se trata de un script de shell ejecutable.
Antes de poder ejecutarlo, debemos darle permisos de ejecución. (+x) o (744) por ello, haremos uso del comando
chmod y damos permisos de ejecución, si se desea, se pueden dar a todos los usuarios y grupos.
1. $ . /nombre_script
2. $ sh nombredelscript.sh
3. $ exec nombre_script
Método 1: $ . / nombre_script
Método 2: $ sh nombredelscript.sh
COMENTARIOS EN EL SHELL:
Siempre es recomendable añadir comentarios a nuestros programas en cualquier lenguaje, una buena norma es
además de los comentarios específicos donde sean necesarios, usar una cabecera con el Nombre del programa y
las principales características.
En los scripts, una línea de comentario debe empezar por el símbolo almohadilla (#)
# Búsqueda de cadenas
# Fecha: 18/02/2024
# Autor: J.A. Sánchez
# Modificado por: A.S. Romero.
# Este programa sirve para ...utiliza ...
# .....................
VARIABLES DE USUARIO
Es posible definir variables por parte del usuario, las normas y significado de las mismas son las
siguientes:
1. Para definirlas se admiten mayúsculas, minúsculas, números y carácter subrayado. Deben comenzar por
un carácter Alfabético o Subrayado.
2. No es necesario declararlas previamente a su uso, si se usa una variable que no ha sido creada o
asignada, su valor es nulo.
3. No tienen tipo, todo lo que se escriba en ellas, tiene significado de carácter. Los números se almacenan
como si fuesen cadenas de texto y no en formato binario como puede ser en un lenguaje orientado a
proceso de datos.
nombre=pepe
6. Para utilizar el contenido (operar, visualizar, mover..) de una variable se antepone delante del nombre el
símbolo $
$ echo Tu nombre es $nombre
Ejemplo:
$ i=1 ; echo $i
$ msg="Mola mundo!" ; echo $msg
7. Las variables son locales al shell donde se han creado. En el caso de querer poder usarlas en el Shell
actual y todos los subshell que se utilicen, hay que usar la orden export:
Página 2
Linux Script Curso 2023-2024
• export
• export lista_variables
nombre=pepe
edad=18 Las variables son locales al Shell actual
Las variables que se exportan mantienen su valor del shell padre a los hijos. Pero nunca al contrario, una
variable exportada no se exporta al shell padre del actual donde se ha creado.
Las variables exportadas se las llama a veces variables globales o variables de entorno (aunque este
último nombre a veces se reserva a las variables del Sistema).
9. Si la variable va a contener cadenas con caracteres en blanco hay que usar comillas para asignarla:
10. Las variables incluidas en líneas echo con comillas dobles son interpretadas correctamente:
ciudad=mostoles
echo “Vives en $ciudad”
11. Se puede asignar a una variable la salida de una orden haciendo uso de los acentos graves (acento
francés):
fecha=`date`
12. Para separar una variable de otros caracteres situados al lado se deben usar llaves o comillas dobles:
$ nombre=maria
$ echo nombre
maria
$ echo ${nombre}no
mariano
$ echo “$nombre”no
mariano
13. Se puede hacer que una variable sea de solo lectura con la instrucción readonly (es la forma en este
lenguaje de declarar constantes):
• readonly
• readonly lista_variables
$ instituto=JuanDeLaCierva
$ ciudad=Madrid
Página 3
Linux Script Curso 2023-2024
Usando readonly sin argumentos, se muestran las variables que no son modificables junto con sus
valores.
14. La asignación de variables desde teclado en un programa se efectúa con la instrucción read como
veremos próximamente.
15. Se puede restaurar (vaciar) el contenido de una variable haciendo uso de la orden unset:
• unset lista_variables
$ unset nombre
$ nombre=
Son variables globales creadas por el sistema (ya están exportadas). Algunas son modificables por el usuario
(PATH, PS1,...) y otras no lo son (LOGNAME). A continuación, se muestran algunos valores de variables del
Sistema:
o CDPATH Nombre del path usado por la orden cd, si no tiene nada examina el de
trabajo
o EDITOR Editor predeterminado que usaran los programas.
o HOME Directorio del usuario.
o LOGNAME Nombre de usuario.
o MAIL Nombre del archivo del buzón de correo del usuario.
o MAILCHECK Segundos que usa el shell para mirar si examinar el correo y mandar aviso.
o PATH Ruta de búsqueda del usuario, donde el shell busca las órdenes externas.
o PPID Identificación del proceso padre del actual.
o PS1 y PS2 Indicadores del prompt primario y secundario.
o SHELL Ruta absoluta del Shell que estamos usando.
o TERM Tipo de terminal que estamos usando.
Orden set
La orden set sin argumentos informa de los nombres y los valores de todas las variables locales y del entorno,
sean del usuario o del sistema.
Orden env
La orden env sin argumentos informa de los nombres de las variables de entorno, pero no incluye a las del
usuario. En general da menos información que set.
Estas variables se definen en el fichero .profile. Se puede definir una descripción de ellas con la orden man
environ
Orden export
Página 4
Linux Script Curso 2023-2024
La orden export sin argumentos informa de los nombres y los valores de todas las variables exportadas en el
shell actual.
Se puede invocar un script con argumentos, de forma que internamente se reciban en variables denominadas
parámetros posicionales.
Las variables o parámetros posicionales no son modificables y se denominan $1,$2..... $9 (Se pueden
usar hasta 9 parámetros en la línea de órdenes, este límite se puede ampliar con la orden shift aunque es inusual
programas con un nº tan elevado de parámetros).
$1 Lopez
$2 Getafe
$3 34
$4 916642334
Cada vez que se ejecuta una orden devuelve un código entre 0 y 255. El valor 0 nos indica que la orden se ha
ejecutado correctamente, mientras que un valor diferente de 0, indica que se ha producido un error. El valor de
los códigos de error difiere de una orden a otra y no son de especial interés en estos apuntes.
Se puede usar la orden set para asignar las variables posicionales en un programa:
• set argumentos
Página 5
Linux Script Curso 2023-2024
Ejemplo:
$ date
Sat Aug 7 13:26:42 PM 1999
$ set `date`
$ echo “$1 $2 $3 $4 $5 $6”
Sat Aug 7 13:26:42 PM 1999
$ echo “$@”
Sat Aug 7 13:26:42 PM 1999
$ echo “$3 de $2 de $6”
7 de Aug de 1999
Ejemplo:
ORDEN EXIT
La orden exit sirve para transferir el control al proceso que hace la llamada. El argumento de la orden exit es
número opcional, que se le proporciona al proceso que hace la llamada como estado de salida del proceso que
concluye.
• exit [numero]
Ejemplo:
.................
.................
.................
exit 0
En el punto anterior vimos que todas las ordenes Linux proporcionan un código de estado 0, si se ejecutan
correctamente, que es recogido en la variable $?.
No es necesario usar la orden exit a menos que se desee terminar un proceso desde varios puntos del código
(mala práctica en programación estructurada).
Página 6
Linux Script Curso 2023-2024
Se puede terminar un shell con la orden exit número como última línea si deseamos recoger el valor en la variable
$?.
Cuando se ejecuta una orden exit sin argumento, el núcleo de Linux asigna el valor de estado proporcionado por
el script.
exit 0
Orden echo
La orden echo visualiza en el dispositivo de salida estándar (stdout), pantalla, el valor de sus
argumentos, que puede ser el nombre de una variable o una expresión que contenga variable/s, o simplemente de
una cadena de texto.
• echo argumentos......
Ejemplos:
\b → blackspace (Retroceso)
\f → Salto de página
\t → tabulador.
\\ → carácter\.
Es típico el uso de
\c en echo para no avanzar línea:
• Los argumentos sin comillas son interpretados literalmente como texto, excepto aquellos que
sean caracteres especiales de Linux.
Página 7
Linux Script Curso 2023-2024
• Los argumentos que estén entre comillas dobles no son interpretados excepto el símbolo $, el
símbolo \ , y las comillas simples y dobles.
El símbolo \ sirve para inhibir el significado especial del siguiente carácter.
• Los argumentos encerrados entre acentos graves (francés) ejecuta la orden y sitúa su salida
estándar en el ámbito donde estén situados (sustitución de orden.)
Orden read
Si desea escribir un shell interactivo, que solicite información al usuario a través de la entrada estándar (stdin)
teclado, se debe usar la orden read que sirve para asignar variables en tiempo de ejecución (similar al scanf del
lenguaje C):
Ejemplo:
• Tiene un montón de opciones, pero estas son las más importantes y usadas:
-n num_car : Número máximo de caracteres que puedes introducir por teclado.
-p “frase”: Te muestra por pantalla una frase para indicar qué debes introducir.
• La ejecución del programa se detiene cuando se encuentra un read y no continua hasta que se
pulsa Enter.
• Los datos son introducidos como palabras separadas por blancos o tabuladores. Al menos que
utilicemos –d de delimitador.
• Se pueden agrupar varias órdenes en una línea separadas por punto y coma, estas se ejecutarán
de izquierda a derecha en un nuevo subshell.
• Si deseamos que una o más ordenes se ejecuten en el shell actual del script deberemos
encerrarla entre llaves:
{ orden; }
Página 8
Linux Script Curso 2023-2024
ord1 && ord2 Solo se Ejecuta ord2 si la ejecución de ord1 ha tenido éxito.
Esta orden sirve para evaluar expresiones, su uso más simple es para hacer operaciones aritméticas sencillas
y en menor medida para manipular cadenas.
Si hay varios operadores, la suma y la resta se evalúan en último lugar, a no ser que vayan entre
paréntesis. El orden de prioridad de las operaciones es %, * /, + -
Hay que recordar que los símbolos paréntesis y asterisco son especiales del lenguaje, por lo que para
poderlos usar hay que poner el símbolo \ delante o encerrados entre comillas simples.
Los símbolos > y < tienen significado especial para el Sistema (redireccionamientos) así que hay
que escaparlos (\ delante) o entrecomillarlos.
Los operadores relacionales se usan para comparar operandos y tomar decisiones en función de los
resultados.
Se pueden usar órdenes con cálculos más complejos que usen varios comandos expr.
La orden expr se puede usar interactivamente en la línea de comandos del shell como una calculadora
para pequeños cálculos:
$ expr 5 + 8
13
$ expr 10 \* 2 hay que usar \* para que el asterisco pierda su significado.
20
$ expr 10 ‘*’ 2 Funciona igual
20
$ expr 10 * 2 Error
Página 9
Linux Script Curso 2023-2024
La orden expr se usa normalmente en programación para asignar variables, para que la variable reciba
el valor de la expresión ésta ha de estar entre acentos graves para que la orden se ejecute y devuelva el
valor hacia la variable:
Si necesitamos cálculos complejos hay que usar la orden bc que en realidad es en sí mismo un lenguaje
de programación que admite muchas más posibilidades de cálculo numérico.
if condicion;then
orden_1
orden_2
.......
orden_3
orden_4
......]
[else
orden_5
orden_6
.....]
fi
• Los if evalúan la condición (generalmente expresiones con la sentencia test, aunque puede ser cualquier
comando) y ejecuta las ordenes correspondientes si son ciertas (valor 0).
Página 10
Linux Script Curso 2023-2024
while condición
do
orden_1
orden_2
.......
done
while condición; do
orden_1
orden_2
.......
done
• El bucle se ejecuta mientras que el valor de retorno de la condición sea True (valor 0).
until condición
do
orden_1
orden_2
.......
done
until condición; do
orden_1
orden_2
.......
done
• El bucle se ejecuta hasta que el valor de retorno de la condición sea True (valor 0).
NOTAS:
tros
Página 11
Linux Script Curso 2023-2024
• Los bucles while y until evalúan la condición al principio (primero evalúan y después procesan el
contenido) por lo tanto se ejecutarán de 0 a N veces.
• Se pueden crear bucles infinitos utilizando los valores true o false (valores 0 y 1 respectivamente, al
contrario del lenguaje C).
While true
do
…..
done
Bucle for:
for variable in lista_de_valores
do
orden_1
orden_2
.......
done
• Esta construcción del for toma los valores para la variable de los argumentos de la línea de órdenes.
• Otra de las particularidades de este bucle es que puede ejecutarse a la forma de un bucle en java
Es igual que en java, pero con doble paréntesis. Donde valor es el valor inicial del bucle numérico, condición es
hasta donde debe llegar el valor, e incremento es sumar o restar uno al valor.
Ejemplo:
#! /bin/bash
Página 12
Linux Script Curso 2023-2024
clear
read -p “Introduce un numero” numero
for (( a=0; a <= $numero; a++ ))
do
echo -e “$a \n”
done
read -p “frase”: Muestra por pantalla una frase para saber qué debes introducir.
echo –e: impide que salga en pantalla el salto de línea \n
Alternativa case:
case cadena_a_evaluar in
patron_1)
Orden_1
Orden_2
..... ;;
patron_2)
Orden_3
Orden_4
..... ;;
patron_n)
Orden_n1
Orden_n2
..... ;;
esac
• La sentencia case proporciona un mecanismo de bifurcación múltiple. Esta sentencia compara la cadena a
evaluar con los sucesivos patrones, uno por uno, hasta que encuentre un patrón que coincida o hasta que ya
no queden más patrones que comparar. Si se halla una coincidencia se ejecutan las ordenes correspondientes
al patrón y la sentencia case finaliza.
• Es típico en los programas Shell si se necesita poner como último patrón un comodín que se corresponde con
cualquier posible valor de la cadena a evaluar.
• Se pueden usar metacaracteres ( * . ¿ , [...] ) dentro de los patrones. Además, si se usa el símbolo | para
separar dos patrones equivale a un OR lógico.
Ejemplo:
Página 13
Linux Script Curso 2023-2024
• break (Salir de un bucle) Hace que cualquier bucle while, until o for termine su ejecución y ceda el control
del programa a la instrucción que se encuentre después del bucle.
• continue (Nueva iteración) Detiene la iteración actual de un bucle while, until o for en el punto donde se
encuentre situada y da lugar a una nueva iteración.
• En ambos casos break y continue las instrucciones que hay detrás hasta done no se ejecuten.
La orden test se usa para evaluar expresiones y generar un valor de retorno, este valor no se devuelve a la salida
estándar (pantalla), lo que hace es devolver 0 como código de retorno si la expresión se evalúa como true, y le
asigna 1 si la expresión se evalúa como false.
La orden test es de uso típico como condición para estructuras de control del tipo if, while y until.
IMPORTANTE:
Si se usa el 2º formato con corchetes, a ambos lados de los mismos debe existir un espacio en blanco.
-o OR lógico.
Ejemplo:
-a AND lógico
Ejemplo:
! NOT lógico.
Ejemplo:
[ ! -d /etc/usrmail ]
Se pueden usar paréntesis para agrupar y dar prioridad a expresiones, al escribirlos hay que poner espacios en
blanco antes y detrás de los paréntesis.
Los paréntesis tienen un significado especial para el lenguaje, para poder usarlos hay que ‘ escaparlos’: \
( ................... \ ) o encerrados entre comillas simples.
Esta expresión crea una subcadena a partir de cadena referenciada que contiene num caracteres a partir de
la posición posi.
Ejemplos:
$ palabra=”calamares”
Ejemplos:
$ palabra=”calamares”
Esta expresión devuelve la posición de la primera aparición del carácter especificado dentro de la cadena.
$ palabra=”calamares”
• El código anterior muestra como introducir datos en la misma línea que la pregunta (El read del Shell Korn
dispone de la opción de incluir mensaje). Se pueden usar también los \n y \t.
conta=0
....
conta = ` expr $conta + 1 `
FECHA=`date`
echo El contenido de la variable \$FECHA es $FECHA
• El código anterior muestra una sustitución del contenido de una orden correctamente.
FECHA=date
echo la fecha actual es $FECHA
• El código anterior muestra el intento erróneo de sustitución del contenido de una orden.
FECHA=date
eval $FECHA
• El código anterior muestra un ejemplo de la orden eval que sirve para ejecutar el contenido de una variable
(no está en los apuntes).
Página 16
Linux Script Curso 2023-2024
• El código anterior es un ejemplo de sustitución del contenido de una orden, informa de los programas en
ejecución de un usuario introducido por teclado.
if test $# -ne 3
then
echo “No has introducido los 3 argumentos indicados”
exit 1
else
total=`expr $1 + $2 + $3`
echo “La suma de $1 $2 y $3 es $total”
fi
• El código anterior es un ejemplo de cómo controlar que el nº de argumentos de una orden sea el correcto, el
programa pretende sumar 3 valores numéricos pasados como argumentos. El uso de la palabra test se
considera anticuado siendo sustituido por los corchetes.
if [ “$#” -ne 3 ]
then
echo “No has introducido los 3 argumentos indicados”
exit 1
else
total=$1 + $2 + $3
echo “La suma de $1 $2 y $3 es $total”
fi
• El código anterior es una versión con corchetes de test. Es buena costumbre encerrar todas las variables entre
comillas.
if [ “$#” != 3 ]
then
echo “No has introducido los 3 argumentos indicados”
exit 1
else
total=$1 + $2 + $3
echo “La suma de $1 $2 y $3 es $total”
fi
• El código anterior no es muy recomendable, ya que usa la orden test para comparar cadenas, en este caso
funciona correctamente. Observar el caso siguiente:
else…..
fi
if [ “$dato2” = 5 ] then…….
else…..
fi
• En el ejemplo anterior se ejecuta el then del if 1º y 3º, pero en los if 2º y 4º se ejecuta el else.
• El código anterior sirve para comprobar si se ha creado un directorio, mediante una sustitución de orden en
la condición del if.
Si la instrucción se ejecuta devuelve el código de estado 0 que es true, por lo que se ejecuta la
condición then del if.
El problema de esta construcción es que la orden mkdir muestra la salida estándar de error por
pantalla cuando no se puede ejecutar.
• En el ejemplo anterior se hace uso de la opción –d del test para saber si el nombre introducido ya existe y es
un directorio. Es mucho mejor que el otro.
if [ -d $DIRE ]
……..
En el caso de que $DIRE no existiese, el if quedaría como sigue:
if [ -d ]
..........
Algo que seguramente al intérprete del shell no le va a gustar nada.
• Este último código es como...más fino, usa la variable del código de estado $? Para comprobar si la orden se
ha ejecutado correctamente.
• El ejemplo es similar capturando la variable de estado previamente en una variable. Hay que hacerlo
inmediatamente después de la orden que se quiere comprobar ya que si no obtendremos resultados
inesperados:
Este ejemplo no hace lo que pretendemos ya que el código de estado va a devolver siempre 0
ya que corresponde a la orden echo anterior que es correcta.
nombre=”juan”
apellido=”nadie”
[ “$nombre” = “$apellido” ]
echo $?
[ “$nombre” = “juan” ]
echo $?
• En el ejemplo anterior observamos que no es necesario usar los test en un if. Las dos líneas del echo con el
código de estado imprimirán 1 y 0 respectivamente.
• Los operadores && y || resultan muy útiles para sustituir if de forma que el código queda más compacto
(pero menos evidente para programadores inexpertos).
El primer ejemplo supone que está dentro de un bucle y hace que se produzca una nueva iteración
cuando el fichero referenciado por la variable exista y no tenga permiso de escritura.
El segundo ejemplo copia el fichero referenciado en la variable en el directorio /tmp, siempre que
exista y tenga permiso de lectura.
• Construcción if con alternativas múltiples, se evalúan de arriba abajo hasta que se encuentre una que sea
cierta y se finaliza el if. En el caso de que no se cumpla ninguna condición se ejecutarán las sentencias del
else si es que existe.
• Ejemplo idéntico al previo, pero ahorrándonos talar algún árbol (ocupa menos papel).
clear
clave=”agente007”
echo “Introduzca la Clave \c”
read respuesta
while [ “$respuesta” != “$clave” ]
do
echo “Error, vuelve a intentarlo”
echo “Introduzca la Clave \c”
read respuesta
done
echo “ Puede usted pasar”
clear clave=”agente007”
echo “Introduzca la Clave \c”
read respuesta
until [ “$respuesta” = “$clave” ]
do
echo “Error, vuelve a intentarlo”
echo “Introduzca la Clave \c”
read respuesta
done
echo “ Puede usted pasar”
Página 20
Linux Script Curso 2023-2024
• El mismo ejemplo pero con un until. Recordar que lleva evaluación al principio.
clear respu=s
while [ “$respu”=s -o “$respu”=S ]
do
echo “Que cadena quieres buscar \c”; read cadena
echo “En que fichero quieres buscarla \c”; read fichero
if [ -f “$fichero” ]
then
grep “$cadena” “$fichero” > resultado
if [ -s resultado ]
then
echo “La cadena $cadena buscada existe en el fichero $fichero”
else
echo “La cadena $cadena buscada no existe en el fichero $fichero”
fi
rm resultado
else
echo “El fichero $fichero no es un fichero ordinario”
fi
echo “quieres hacer mas búsquedas (s-n) \c”; read respu
done
• El ejemplo anterior es un script que realiza una búsqueda de una cadena en un fichero usando la orden grep.
Como esta orden muestra su salida estándar por pantalla, se redirecciona a un fichero llamado resultado.
while true
do
............
if………… break done
• Si creamos un bucle infinito hemos de salir de alguna forma, mediante break para saltar a la sentencia
posterior al mismo o con exit para finalizar el script.
Bucles For:
• El código anterior muestra un uso de la estructura for, la variable contador toma los valores de la lista
sucesivamente.
Página 21
Linux Script Curso 2023-2024
echo $fichero
done
• En este caso se muestran todos los ficheros del directorio actual, ya que * representa a todos los ficheros.
• El ejemplo anterior no es demasiado útil, pero ilustra como for toma la lista de valores mediante la
sustitución de la salida de la orden ls.
• Este caso muestra el uso de la estructura for sin poner la lista de valores, entonces toma como valores los
argumentos de línea de órdenes.
El ejemplo lo único que hace es mostrarnos los argumentos que le pasamos al programa en la
llamada
• En el código anterior, la lista de valores la devuelve la orden find que devuelve los archivos de tipo ordinario
que hay en /usr/kvdai12
El programa imprimirá y eliminara todos los archivos referenciados, fijarse la construcción con &&
para que elimine el fichero solo en el caso de que la orden lp haya actuado correctamente. Este
script imprime y elimina todos los ficheros dentro del directorio indicado y subdirectorios.
• o El ejemplo anterior, sirve para comprimir los archivos de los directorios que le pasemos al script como
argumentos en la línea de ordenes:
• compress nombre_fichero
• uncompress nombre_fichero.z
Esta orden restaura el archivo a su formato original, creando un nuevo archivo sin el sufijo .z
haciendo desaparecer el comprimido.
Estructura case:
• En el código anterior vemos el esqueleto básico de un menú mediante el uso de la estructura case.
Página 23
Linux Script Curso 2023-2024
Observar que el valor para cuando no se cumple ninguna de las opciones es * y se pone como
última opción de la estructura case—esac.
• Similar al anterior pero ahora usando letras para el menú y controlando mayúsculas y minúsculas.
• El código anterior comprueba la hora actual (solo la hora usando el formato +%H ).
El autor del programa debe ser de algún país del polo norte o padecer insomnio ya que los buenos
días desde las 00 es un poco fuerte.
Página 24
Linux Script Curso 2023-2024
b | B)
clear
echo “ \n\n\n\t\t\t Contenido del directorio del usuario \n\n”
ls $HOME ;;
c | C)
clear
echo “ \n\n\n\t\t\t Calendario del año actual \n\n”
cal ;;
d | D)
clear
seguir=”n” ;;
*)
clear
echo “ \n\n\n\t\t\t Opción erronea \n\n” ;;
esac
echo “ Pulse una tecla y ENTER para continuar” read pausa
done
• Menú algo más depurado, se posiciona con tabuladores, borra pantalla y detiene la visualización de los
programas con read pausa. Aún no está depurado, falta posicionarse en una fila y columna determinada.
Además cuando pulsamos la opción de finalizar, nos muestra el mensaje de “Pulse una tecla para
continuar”.
• En este caso cualquier valor que comience con S mayúscula o minúscula, actuara como respuesta a Si, y
cualquier valor que comience con N mayúscula o minúscula actuará como respuesta al no.
Este for permite realizar un bucle numérico en Linux, es igual al for del lenguaje C.
Sintaxis
Donde:
Variable: es la variable que usamos dentro del bucle
Valor inicial: es un valor numérico que inicia el bucle
Página 25
Linux Script Curso 2023-2024
Condición final: condición que examinamos para ver si hemos llegado al final de lo
contado
Incremento: suma 1 a la variable del bucle (variable++)
Decremento: resta 1 a la variable del bucle (variable--)
Ejemplo:
#!/bin/bash
#Manejo de for numérico en Linux
#Tabla de sumar
clear
read –p “dime el numero a sumar” sumando
if [ -z sumando ]
then
echo “ el valor de sumando esta vacío”
else
echo “La tabla de sumar del numero $sumando es:”
echo “---------------------------------------------------“
for ((i=0; i<=10; i++))
do
echo “ $sumando + $i = `expr $sumando + $i`”
done
fi
El shell Bourne permite definir funciones, estas constan de una serie de órdenes
llamadas cuerpo de la función, a las cuales se les da un nombre. Las órdenes contenidas en el
cuerpo de la función se invocan empleando el nombre de la misma.
Normalmente, se usan funciones cuando hay una parte del código que se repite en
distintos lugares del guión. Al convertir este código en guión, se ahorra tiempo de escritura. La
desventaja es que el mecanismo de paso de control al código de la función y de devolución del
control a código que hace la llamada requiere tiempo, lo cual hace que el tiempo necesario
para ejecutar el guión aumenta ligeramente.
Otra forma de ahorrar tiempo de escritura consiste en crear otro archivo de guión, y
llamar ese código script como si fuese una orden. Con este método se consigue una
programación modular, pero es más lento que el del uso de funciones ya que los guiones
residen en disco y tienen que pasar a memoria para ejecutarse, mientras las funciones residen
permanentemente en la memoria del ordenador.
• Si son de uso general, las podemos colocar en el archivo .profile del directorio del
usuario, exportándolas para que estén a disposición de todos los procesos hijos del
shell actual.
Página 26
Linux Script Curso 2023-2024
Nombre_funcion()
lista_ordenes
Para poder llamar a una función esta debe estar previamente definida en el código, así
que si se trata de funciones específicas de un guión, deben estar declaradas en la parte
superior del mismo (al contrario de otros lenguajes) o en otro lugar pero previamente una
posible llamada a las mismas.
La orden set visualiza todas las definiciones de funciones que haya en nuestro entorno
actual.
Dentro de una función se puede acceder a las variables del script donde está situada, y
el por el contrario las órdenes del script pueden acceder a las variables definidas en la función.
Se pueden devolver un estado de salida ($?) de una función con la palabra reservada
return y un valor (el 0 significará éxito).
Otra forma de definir el estado de la salida ($?) es usando exit y un valor numérico
como como ya conocemos.
Si lo que se desea es usar otra salida, lo normal es hacerlo con echo, y la llamada a la
función debe ser de la forma:
$A = `mifunción`
Ejemplo de un factorial, el scritp factorial lleva dentro la función fact. Se supone que
el programa se ejecuta con un argumento:
Página 27
Linux Script Curso 2023-2024
fact()
{
f=1
c=1
while [ $c –le $1 ] Declaración de la función
do
f=` expr $f \* $c `
c=` expr $c + 1 `
done
echo “El factorial de $1 es $f”
}
Observar que:
• En este caso la llamada a la función dentro del código no incluye ningún argumento,
alguien podría pensar que se va a pasar los argumentos de la línea de órdenes a la
variable posicional de la función, pero no es así y se produce un error.
Página 28
Linux Script Curso 2023-2024
Los arrays de los script funcionan de la misma forma que los arrays de cualquier
lenguaje de programación. Un array es un conjunto o agrupaciones de valores cuyo acceso
se realiza por los índices, en una script se puede almacenar en un mismo array todo tipo de
cosas: números, cadena, caracteres, etc.
declare –a nombre_array
declare –a nombres
nombre_aray[posición]=valor
nombres[3]=manolo
2. Darle todos los valores de golpe (aunque también se puede decir la posición
deseada en la que quieres guardar uno de los valores)
${nombre_array[posición]}
${nombres[0]}
${#nombre_array[*]}
${#nombres[*]}
Página 29
Linux Script Curso 2023-2024
${nombre_array[*]}
${nombres[*]}
COMANDO bc
Sintaxis:
bc [opciones]
Opciones:
Suma
$ echo '57+43' | bc
Página 30
Linux Script Curso 2023-2024
100
Resta
$ echo '57-43' | bc
14
Multiplicación
$ echo '57*43' | bc
2451
scale
La variable scale determina el número de dígitos que siguen al punto decimal en tu
resultado. Por defecto, el valor de la variable scale es cero. (Salvo que usemos la opción -l en
cuyo caso por defecto vale 20 posiciones decimales.) Esto se puede configurar declarando
scale antes de hacer los cálculos, como en el siguiente ejemplo de división:
$ echo 'scale=25;57/43' | bc
1.3255813953488372093023255
Raiz cuadrada
$ echo 'scale=30;sqrt(2)' | bc
1.414213562373095048801688724209
Potencia
$ echo '6^6' | bc
46656
Paréntesis
Uso paréntesis (brackets) para separar los diferentes componentes de mis sumas
siempre que es posible, elimina cualquier posible duda de que obtenga una respuesta errónea.
Considera los siguientes cálculos:
$ echo '7+(6*5)' | bc
$ echo '7+6*5' | bc
$ echo '6*5+7' | bc
Todos dan la misma respuesta, 37, pero habría escrito el primer cálculo, salvo por supuesto, si
quisiera decir:
$ echo '(7+6)*5' | bc
obase e ibase
Página 31
Linux Script Curso 2023-2024
obase e ibase son variables especiales que definen la base de entrada y de salida.
Justifica obase valores entre 2 y 999, a pesar de que nada mayor que 16 vale la pena para mi!
Justifica ibase valores entre 2 y 16. Algunos ejemplos lo explicarán mejor.
$ FIVE=5 echo
"$FIVE^2" | bc
25
Uso select
Select está a medio camino entre una orden lectura de entrada y una de control de flujo.
Esta orden select nos mostrara por la salida de errores estándar una lista numera que contendrá
todas las palabras después de in (en este caso uno dos tres cuatro). Luego se quedara
esperando nuestra elección. Si tecleamos uno de los números correspondientes a alguna de las
palabras en la lista, se le asignara dicho valor a la variable y se ejecutaran los comandos.
Si no se especifica nada el prompt del sistema que aparece es #?. Se puede variar con
cambiando el valor a la variable del sistema llamada PS3.
Un ejemplo simple:
Otro ejemplo:
#!/bin/bash
select ACCION in Empezar Repetir Acabar
do
case $ACCION in
"Empezar")
echo "El usuario quiere empezar"
;;
"Repetir")
echo "El usuario quiere repetir"
;;
"Acabar")
echo "El usuario quiere salir"
break
;;
*)
echo "No se que quiere el usuario"
;;
esac
done
Página 33