Scripting en BASH
El primer script
Para crear el script “Hola mundo” (holamundo.sh) abrimos un editor de texto (nano
, p.ej.) y escribimos lo siguiente:
#!/bin/bash
echo Hola Mundo
Le damos permisos de ejecución:
$ chmod +x holamundo.sh
Y ya lo podemos ejecutar:
$ ./holamundo.sh
Hola Mundo
Hay que añadir ./
porque “holamundo.sh” no está en el PATH.
La primera línea
#!/bin/bash
indica a la shell que el script debe ejecutarse con el intérprete de comandos/bin/bash
. Debemos incluirla en todos los scripts.
El segundo script
Los comentarios son todas aquellas líneas que comienzan por #
(almohadilla). Son ignoradas por el intérprete de comandos.
El script “comentarios.sh”:
#!/bin/bash
##########################
# Shell script de prueba #
##########################
who
date
El tercer script
El script “educado.sh”:
#!/bin/bash
read –p "¿Cómo te llamas? " nombre
echo Hola $nombre
echo ¿Cómo estás?
El comando
read -p <mensaje> <nombre>
muestra elmensaje
al usuario, luego espera a que se introduzca un dato desde teclado y éste se guarda en la variablenombre
.
Paso de parámetros
Es posible pasar parámetros a un script cuando lo ejecutamos, como si se tratara de un comando más.
Son accesibles utilizando las siguientes variables:
Parámetro | Descripción |
---|---|
$0 | Corresponde con el nombre del script. |
$1 | Es el primer parámetro pasado al script. |
$2 | Es el segundo parámetro pasado al script. |
$3 | Es el tercer parámetro pasado al script. |
$n | Es el enésimo parámetro pasado al script. |
Script “parametros.sh”:
#!/bin/bash
########################################
# Muestra los parámetros que le pasamos
# desde la línea de órdenes
########################################
echo Parámetro 0 = $0
echo Parámetro 1 = $1
echo Parámetro 2 = $2
echo Parámetro 3 = $3
Ejemplo de ejecución del script anterior:
$ ./parametros.sh abc 123 xyz
Parámetro 0 = ./parametros.sh
Parámetro 1 = abc
Parámetro 2 = 123
Parámetro 3 = xyz
Variables especiales
Dentro de los scripts podemos usar las siguientes variables especiales:
Parámetro | Descripción |
---|---|
$# | Número de parámetros pasados al script (excluyendo el nombre del script). |
$? | Código de retorno de la última orden ejecutada (si es <> 0 indica que hubo un error). |
$* | Cadena de parámetros entera (excluyendo el nombre del script). |
$@ | Array de parámetros (excluyendo el nombre del script), donde cada parámetro es una cadena distinta dentro del array. |
Script “especiales.sh”:
#!/bin/bash
########################################
# Muestra las variables especiales
########################################
echo La variable \# vale $#
echo La variable \* vale $*
cp
echo La variable \? vale $?
\
(escapar): Se pone delante de los símbolos especiales para que no sean interpretados y se muestren literalmente.
Ordenes importantes en la programación de scripts
El comando shift
Sintaxis: shift n
Desplaza “n” posiciones a la izquierda los parámetros, de forma que, por ejemplo, el parámetro $3 pase a ser $2 si n=1.
Esto permite leer los parámetros cuando son más de 9.
Script “desplazamiento.sh”:
#!/bin/bash
########################################
# Ejemplo de uso de shift
########################################
echo Antes \$1 vale: $1
echo Antes \$2 vale: $2
echo Antes \$3 vale: $3
echo Antes \$# vale: $#
echo Antes \$* vale: $*
shift 2
echo Ahora \$1 vale: $1
echo Ahora \$2 vale: $2
echo Ahora \$3 vale: $3
echo Ahora \$# vale: $#
echo Ahora \$* vale: $*
Ejemplo de ejecución del script anterior: ./desplazamiento uno dos tres cuatro cinco
El comando read
Sintaxis: read [-p <prompt>] <variable(s)>
Donde:
-p <prompt>
muestra un mensaje antes de esperar a que se introduzca texto.variable(s)
es la lista de nombres de variables donde se guardará el texto introducido.
Se utiliza para leer información desde el teclado (entrada estándar) y guardarla en variables
Script “leer_variable.sh”:
#!/bin/bash
########################################
# Ejemplo de uso de read
########################################
read -p "Introduce un valor: " var
echo El valor introducido es: $var
Script “leer_variables.sh”:
#!/bin/bash
########################################
# Ejemplo de uso de read para leer
# varias variables de una vez
########################################
read -p "Introduce tres valores separados por espacios: " var1 var2 var3
echo El valor introducido para var1 es: $var1
echo El valor introducido para var2 es: $var2
echo El valor introducido para var3 es: $var3
Ejemplo de uso del script anterior:
$ ./leer_variables.sh hola don pepito, hola don jose
El valor introducido para var1 es: hola
El valor introducido para var2 es: don
El valor introducido para var3 es: pepito, hola don jose
El comando expr
Sintaxis: expr arg1 op arg2 [ op arg3 … ]
Permite evaluar expresiones aritméticas, lógicas y relacionales (comparaciones).
Operadores aritméticos
Operador | Descripción | Ejemplo |
---|---|---|
+ | Suma arg1 y arg2. | expr 12 + 34 |
- | Resta arg1 y arg2. | expr 12 - 34 |
* | Multiplica arg1 por arg2. | expr 12 \* 34 |
/ | División entera entre arg1 y arg2. | expr 34 / 12 |
% | Resto de la división entre arg1 y arg2. | expr 34 % 12 |
:warning: Al multiplicar es necesario escapar el símbolo
*
con una\
(barra invertida)
Script “sumar.sh”:
#!/bin/bash
########################################
# Suma dos variables introducidas por teclado
########################################
echo
echo Suma de dos variables
echo ---------------------
echo
read -p "Introduce la primera variable: " arg1
read -p "Introduce la segunda variable: " arg2
resultado=$(expr $arg1 + $arg2)
# es lo mismo: resultado=`expr $arg1 + $arg2`
echo El resultado es $resultado
Es posible usar paréntesis en la expresión para alterar la prioridad de las operaciones, pero también hay que escaparlos con una \
delante.
Script “calculos.sh”:
#!/bin/bash
########################################
# Calcula: 2 * ( arg1 – arg2 )
########################################
read -p "Introduce la primera variable: " arg1
read -p "Introduce la segunda variable: " arg1
resultado=$(expr 2 \* \( $arg1 - $arg2 \))
echo El resultado es $resultado
*
,(
y)
son escapados con\
porque tienen un significado especial para la BASH.
Operadores relacionales
Operador | Descripción | Ejemplo |
---|---|---|
= | ¿Son los operandos iguales? | expr 4 = 5 |
!= | ¿Son los operandos distintos? | expr 4 != 5 |
> | ¿Es el primer operando mayor que el segundo operando? | expr 4 \> 5 |
>= | ¿Es el primer operando mayor o igual que el segundo operando? | expr 4 \>= 5 |
< | ¿Es el primer operando menor que el segundo operando? | expr 4 \< 5 |
<= | ¿Es el primer operando menor o igual que el segundo operando? | expr 4 \<= 5 |
Si el resultado es verdadero devuelve 1, si es falso devuelve 0.
>
y<
tienen significado especial para la BASH (son redirecciones) y hay que escaparlos.
Script “comparacion.sh”:
#!/bin/bash
########################################
# Compara dos variables introducidas
# por teclado
########################################
echo
echo Compara de dos variables
echo ------------------------
echo
read -p "Introduce la primera variable: " arg1
read -p "Introduce la segunda variable: " arg2
resultado=$(expr $arg1 = $arg2)
echo El resultado es $resultado
Operadores lógicos
Operador | Descripción | Ejemplo |
---|---|---|
| | “O” lógico (OR). Si arg1 es dintinto de 0, el resultado es arg1; sino, el resultado es arg2. | expr 0 \| 1 |
& | “Y” lógico (AND). Si arg1 y arg2 son distintos de 0, el resultado es arg1; sino, el resultado es arg2. | expr 0 \& 1 |
:eyes:
|
y&
deben ser escapados.
Más ejemplos:
$ expr 0 \& 2
0
$ expr 0 \& 0
0
$ expr 1 \& 1
1
$ expr 1 \| 3
1
$ expr 0 \| 3
3
El comando test
Para archivos y directorios
Sintaxis: test –<opcion> <argumento>
ó [ –<opcion> <argumento> ]
Donde:
opcion
indica el tipo de comprobación (test) que se va a realizar (ver tabla más abajo).argumento
valor sobre el que se va a realizar la comprobación.
El comando test
devuelve el resultado de la comprobación como un valor de retorno, que podemos consultar mediante la variable $?
. A diferencia de expr
, no muestra nada en la salida estándar.
Algunas opciones relacionadas con archivos y directorios:
Opción | Descripción |
---|---|
-f | Devuelve verdadero (0) si el archivo existe y es regular (no es directorio ni archivo de dispositivo). |
-s | Devuelve verdadero (0) si el archivo existe y tiene tamaño mayor que cero. |
-r | Devuelve verdadero (0) si el archivo existe y tiene permiso de lectura. |
-w | Devuelve verdadero (0) si el archivo existe y tiene permiso de escritura. |
-x | Devuelve verdadero (0) si el archivo existe y tiene permiso de ejecución. |
-d | Devuelve verdadero (0) si existe y es un directorio. |
-e | Devuelve verdadero (0) si existe. |
Ejemplo:
# comprueba si existe el fichero /etc/passwd
$ test -f /etc/passwd ; echo $?
0 # verdadero
$ test -f meloinvento ; echo $?
1 # falso
# comprueba si existe el directorio /etc
$ test -d /etc ; echo $?
0 # verdadero
# comprueba si existe el directorio /etc/passwd
$ test -d /etc/passwd ; echo $?
1 # falso
Igual que el ejemplo anterior pero usando la otra notación aceptada por la BASH para el comando test
:
# comprueba si existe el fichero /etc/passwd
$ [ -f /etc/passwd ] ; echo $?
0
# comprueba si existe el fichero meloinvento
$ [ -f meloinvento ] ; echo $?
1
# comprueba si existe el directorio /etc
$ [ -d /etc ] ; echo $?
0
# comprueba si existe el directorio /etc/passwd
$ [ -d /etc/passwd ] ; echo $?
1
Para cadenas de caracteres
Sintaxis: test cadena1 operador cadena2
ó [ cadena1 operador cadena2 ]
Operadores:
Operador | Descripción |
---|---|
= | Devuelve verdadero (0) si cadena1 es igual a cadena2, y falso (1) en caso contrario. |
!= | Devuelve verdadero (0) si cadena1 es distinta de cadena2. |
< | Devuelve verdadero (0) si cadena1 va antes alfabéticamente que cadena2. |
> | Devuelve verdadero (0) si cadena1 va después que cadena2. |
>
y<
hay que escaparlos para que no sean interpretados por la BASH (son redirecciones) .
Es sensible a mayúsculas y minúsculas, por lo que “hola” es distinto de “Hola” u “HOLA”.
Ejemplos:
# comprueba si hola<>adios
$ [ "hola" != "adios" ] ; echo ?
0 # Verdadero
# comprueba si hola>adios
$ [ "hola" \> "adios" ] ; echo ?
0 # Verdadero
# comprueba si hola<adios
$ [ "hola" \< "adios" ] ; echo ?
1 # Falso
# comprueba si hola=adios
$ [ "hola" = "adios" ] ; echo ?
1 # Falso
# comprueba si hola=hola
$ [ "hola" = "hola" ] ; echo ?
0 # Verdadero
# comprueba si hola=HOLA
$ [ "hola" = "HOLA" ] ; echo ?
1 # Falso
Es conveniente poner las cadenas entre comillas dobles (“”), sobre todo si tienen espacios.
$ [ pepito = "pepito" ] ; echo $?
0
$ [ pepito perez = "juan perez" ] ; echo $?
bash: [: demasiados argumentos # error
2
Las variables también hay que ponerlas entre comillas dobles (“”), para evitar errores en caso de que la variable no exista o esté vacía.
[ "$var" = "hola" ]
Para números
Sintaxis: test numero1 operador numero2
ó [ numero1 operador numero2 ]
Operadores:
Operador | Descripción |
---|---|
-lt | numero1 menor que numero2 (less than). |
-le | numero1 menor o igual que numero2 (less or equal) |
-gt | numero1 mayor que numero2 (greater than) |
-ge | numero1 mayor o igual que numero2 (greater or equal) |
-eq | numero1 igual a numero2 (equal) |
-ne | numero1 distinto de numero2 (not equal) |
Ejemplos:
$ a=23
# comprueba si a<55
$ [ $a -lt 55 ] ; echo $?
0 # Verdadero
# comprueba si a<>23
$ test $a -ne 23 ; echo $?
1 # Falso
Operadores lógicos
Sintaxis: test operando1 operador operando2
ó [ operando1 operador operando2 ]
Permite componer expresiones más complejas (AND, OR y NOT) con el comando test
.
Operadores:
Operador | Descripción |
---|---|
-a | “Y” lógico (AND). Si operando1 y operando2 son true , devuelve true (0), sino devuelve false (1). |
-o | “O” lógico (OR). Si operando1 o operando2 son true , devuelve true (0), sino devuelve false (1). |
! | Negación (NOT). Invierte el operando. Si operando1 es true (0), devuelve false (1), y si es false (<>0) devuelve true (0). |
(…) | Paréntesis. Permiten agrupar expresiones y alterar el orden de evaluación. :warning: Deben escaparse con \ . |
!
(NOT) es un operador unario:test ! operando1
, por lo que sólo recibe un operando.
Ejemplos:
$ a=12
$ b=15
# comprueba si a=12 y b=15
$ [ $a -eq 12 -a $b -eq 15 ] ; echo $?
0
# comprueba si a=b o b=15
$ [ $a -eq $b -o $b -eq 15 ] ; echo $?
0
# comprueba si a<b y b=15 y no existe el fichero /etc/passwd
$ [ $a -lt $b -a $b -eq 15 -a ! -f /etc/passwd ] ; echo $?
1
# comprueba si a<b y b=15 y no existe el directorio /etc/passwd
$ [ $a -lt $b -a $b -eq 15 -a ! -d /etc/passwd ] ; echo $?
0
# comprueba si a<b y b=15 y existe el directorio /bin
$ [ $a -lt $b -a $b -eq 15 -a -d /bin ] ; echo $?
0
# comprueba si ( a<b y b=50 ) ó no existe el fichero /etc/passwd
$ [ \( $a -lt $b -a $b -eq 50 \) -o ! -f /etc/passwd ] ; echo $?
1
Estructuras de control
if
Sintaxis:
if condicion1
then
ordenes
elif condicion2
then
ordenes
else
ordenes
fi
Nos permite tomar decisiones a partir de los códigos de retorno de los comandos utilizados como condiciones.
Normalmente se usa junto con la orden test
.
El script “existe-hosts.sh”:
#!/bin/bash
#############################
# Ejemplo de uso de if-fi
#############################
if test –f /etc/hosts
then
cat /etc/hosts
else
echo El archivo no existe
fi
Si el código de retorno del comando
test
devuelve 0 (verdadero), se ejecuta la ordencat
.Si es <> 0, es falso y se ejecuta la orden
echo
.
El script “crea-dir.sh”:
#!/bin/bash
#################################################
# Crea el directorio indicado por parámetro si no
# existe, y le da permisos sólo al propietario
#################################################
if [ ! –d $1 ]
then
mkdir $1
chmod 700 $1
fi
Podemos validar los parámetros pasados al script, como en el siguiente ejemplo (“comprobar.sh”):
#!/bin/bash
#######################################################
# Comprueba si existe el archivo pasado por parámetro,
# y si existe indica de qué tipo es.
#######################################################
# comprueba si el número de parámetros ($#) pasados al script es 0
if [ $# -eq 0 ]; then
echo Debes introducir al menos un argumento.
exit 1
fi
if [ -f "$1" ]; then
# es un archivo regular
echo –n "$1 es un archivo regular "
if [ -x $1 ]; then
echo "ejecutable"
else
echo "no ejecutable"
fi
elif [ -d "$1" ]; then
# es un directorio
echo "$1 es un directorio"
else
# es una cosa rara
echo "$1 es una cosa rara o no existe"
fi
También podemos comprobar el resultado de la ejecución de otros programas.
Comprobar si existe un determinado usuario (“existe-usuario.sh”):
#!/bin/bash
if grep –q "^$1:" /etc/passwd
then
echo El usuario $1 ya existe en el sistema.
else
echo El usuario $1 no existe en el sistema.
fi
La opción
-q
degrep
hace que el resultado no salga en la consola, sino que simplemente el comando devuelva 0 (verdadero) si lo encuentra y <> 0 (falso) en caso contrario.
Ampliación del script anterior para averiguar además si el usuario es regular o del sistema (“existe-usuario2.sh”):
#!/bin/bash
if grep –q "^$1:" /etc/passwd
then
echo El usuario $1 ya existe en el sistema.
IDU=$(cat/etc/passwd | grep "^$1:" | cut –f 3 –d)
if [ $IDU –ge 500 ]
then
echo $1 es un usuario regular
else
echo $1 es un usuario del sistema
fi
else
echo Elusuario $1 no existe en el sistema.
fi
case
Sintaxis:
case palabra in
patron1)
orden1
;;
patron2)
orden2
;;
[...]
patronN)
ordenN
;;
esac
Controla el flujo de ejecución basándose en la “palabra” dada.
La palabra se compara, en orden, con todos los patrones.
Cuando la palabra coincida con un patrón, se ejecutan todas las órdenes que vayan a continuación, hasta encontrar ;;
(doble punto y coma).
Ejemplo “hoy.sh”:
#!/bin/bash
#############################
# Ejemplo de uso de case-esac
#############################
dia=$(date | cut –c 1-3)
case $dia in
lun) echo Hoy es lunes ;;
mar) echo Hoy es martes ;;
mié) echo Hoy es miércoles ;;
jue) echo Hoy es jueves ;;
vie) echo Hoy es viernes ;;
sáb) echo Hoy es sábado ;;
dom) echo Hoy es domingo ;;
*) echo No se sabe qué es hoy ;;
esac
Ejemplo “letras.sh”:
#!/bin/bash
read -p "Introduzca A, B o C: " letra
case "$letra" in
A)
echo Introdujo A
;;
B)
echo Introdujo B
;;
C)
echo Introdujo C
;;
*)
echo No introdujo A, B o C
;;
esac
Variante del ejemplo anterior, donde acepta las letras tanto en mayúsculas como un minúsculas; ejemplo “letras-mayus-minus.sh”:
#!/bin/bash
read -p "Introduzca A, B o C: " letra
case "$letra" in
a|A)
echo Introdujo A
;;
b|B)
echo Introdujo B
;;
c|C)
echo Introdujo C
;;
*)
echo No introdujo A, B o C
;;
esac
Ejemplo “menu-comandos.sh”:
#!/bin/bash
################################
# Menú para comandos sencillos
################################
echo –e "\n --- MENU DE COMANDOS---\n"
echo " a. Fecha y hora actual"
echo " b. Usuarios conectados"
echo " c. Nombre del directorio detrabajo"
echo " d. Contenidos del directoriode trabajo"
echo
read -p "Introduzca una opción: " opcion
echo
case "$opcion" in
a) date ;;
b) who ;;
c) pwd ;;
d) ls ;;
*) echo Opción incorrecta ;;
esac
while
Sintaxis:
while condición
do
orden(es)
done
Se ejecutan las órdenes una y otra vez mientras se cumpla la condición.
La condición se evalúa a verdadero si es 0, y falso en caso contrario (como if-fi
).
Como condición podemos utilizar el resultado de la ejecución de un comando, aunque lo normal es usar test
.
Ejemplo ““mientras.sh”:
#!/bin/bash
###################################
# Ejemplo de uso de while
###################################
a=42
while [ $a –le 53 ]
do
echo Contador = $a
a=$(expr $a + 1)
done
Ejemplo “lineas.sh”:
#!/bin/bash
##################################################
# Va leyendo línea a línea elfichero /etc/passwd
##################################################
numero=0
while read linea
do
numero=$(expr $numero + 1)
echo $numero $linea
done < /etc/passwd
echo "El fichero tiene $numero líneas"
until
Sintaxis:
until condición
do
orden(es)
done
Es similar a while
sólo que en vez de ejecutar las órdenes “mientras” se cumpla la condición, las ejecuta HASTA (until) que se cumpla. Es decir, cuando la condición se cumple, termina.
Al igual que con if
y con while
, la condición es verdadera si vale 0 y falsa en caso contrario.
Como condición podemos utilizar el resultado de la ejecución de un comando, aunque normal es usar test
.
Ejemplo “hasta.sh”:
#!/bin/bash
until [ "$a" = hola ]
do
read -p "Introduce una cadena: " a
done
for
Sintaxis:
for variable in lista
do
orden(es)
done
El bucle se repite por cada una de las palabras o valores que contenga “lista”. En cada iteración del bucle for
, “variable” toma el valor del elemento correspondiente de “lista”.
Ejemplo “saludar-varios.sh”:
#!/bin/bash
for i in Fran Árgel Paco Javi
do
echo "Hola $i, ¿cómo estás?"
done
Ejemplo “comprobar-varios.sh”:
#!/bin/bash
##########################################################
# Comprueba si existen los archivos pasados por parámetro,
# y si existe indica de qué tipo es.
##########################################################
if [ $# -eq 0 ]; then
echo Debes introducir al menos un argumento.
exit 1
fi
for fichero in $*
do
if [ -f "$fichero" ]; then
# es un archivo regular
echo –n "$fichero es un archivo regular "
if [ -x $fichero ]; then
echo "ejecutable"
else
echo "no ejecutable"
fi
elif [ -d "$fichero" ]; then
# es un directorio
echo "$fichero es un directorio"
else
# es una cosa rara
echo "$fichero es una cosa rara o no existe"
fi
done
break, continue y exit
break
Hace que cualquier bucle while
, for
o until
termine y pase el control a la siguiente línea después de done
.
continue
Hace que termine la iteración actual de cualquier bucle while
, for
o until
y pase directamente a la siguiente iteración sin terminar de ejecutar las órdenes de la iteración actual.
exit [n]
Termina la ejecución del script y devuelve n
como código de retorno (0 significa éxito, distinto de 0 significa error)
select
Sintaxis:
select i [ in lista ]
do
orden(es)
done
Muestra un menú con las opciones de “lista”. Cuando elijamos una opción, i
toma el valor de la opción seleccionada y se ejecutan las órdenes. El bucle select
sólo termina con break
o exit
.
Es útil para hacer menús, combinándolo con un case
anidado.
Ejemplo “elección.sh”:
#!/bin/bash
PS3="Elije una opción: "
select i in Listado Quien Salir
do
case $i in
Listado) ls –l ;;
Quien) who ;;
Salir) exit 0 ;;
*) echo “Eeehhh???” ;;
esac
done
PS3 es la variable de entorno que corresponde al prompt de
select
.
Funciones
Sintaxis de definición de una función:
nombre() {
orden(es)
}
Donde:
nombre
es el nombre de la función.
Las funciones permiten agrupar un conjunto de órdenes que se ejecutan con una cierta frecuencia, para poder reutilizarlas.
Podemos pasarle parámetros a la función al invocarla, y recogerlos dentro con $1
, $2
, …, $n
, así como conocer el número deparámetros con $#
u obtenerlos todos con $*
. Es como si el contenido de la función fuera un script dentro del script.
Las funciones se usan dentro del script como si fueran comandos.
Para devolver un valor desde una función se puede hacer enviando el resultado a la salida estándar (con un echo
por ejemplo).
Podemos declarar tantas funciones como queramos dentro de un script, así como invocar unas funciones desde dentro de otras para crear funciones más complejas.
Ejemplo “func-error.sh”:
#!/bin/bash
# definimos la función "error"
error() {
echo Error de sintaxis
exit 1
}
if [ $# -eq 0 ]; then
error # Invocación de la función "error"
else
echo Hay $# argumentos
fi
Ejemplo “func-sumar.sh”:
#!/bin/bash
sumar() {
echo $(expr $1 + $2)
}
resultado=$(sumar 12 4)
echo $resultado
Ejemplo “espacio-ocupado.sh”:
#!/bin/bash
ocupado() {
particion=$1
df -k | grep /dev/$particion | tr –s " " | cut –d " " –f 3
}
kbToMb() {
kilobytes=$1
resultado=$(expr $kilobytes / 1024)
echo $resultado
}
partSda1=$(ocupado sda1)
partSda2=$(ocupado sda2)
partSdb1=$(ocupado sdb1)
total=$(expr $partSda1 + $partSda2 + $partSdb1)
totalMegas=$(kbToMb $total)
echo "El espacio ocupado total esde $totalMegas MB"
df -k
devuelve el espacio libre y ocupado en kilobytes (-k) por las distintas particiones montadas.
Librería de funciones
Es posible crear una librería de funciones que podemos reutilizar desde otros scripts.
Librería “funciones.sh”:
ocupado() {
particion=$1
df -k | grep /dev/$particion | tr –s " " | cut –d " " –f 3
}
kbToMb() {
kilobytes=$1
resultado=$(expr $kilobytes / 1024)
echo $resultado
}
Script “espacio-ocupado.sh”:
#!/bin/bash
# incluir el script con las funciones para poder utilizarlas
. ./funciones.sh
partSda1=$(ocupado sda1)
partSda2=$(ocupado sda2)
cpartSdb1=$(ocupado sdb1)
total=$(expr $partSda1 + $partSda2 + $partSdb1)
totalMegas=$(kbToMb $total)
echo "El espacio ocupado total esde $totalMegas MB"
:information_source: Para incluir un script dentro de otro ponemos un punto (.) un espacio y la ruta completa al script a incluir.
. /path/to/libreria
También es válida la siguiente forma:
source /path/to/libreria
Arrays (vectores)
Definición de un array de cuatro elementos
$ miArray=(primero segundo tercero cuarto)
Definición de un array añadiendo elemento a elemento:
$ miArray[0]=primero
$ miArray[1]=segundo
$ miArray[2]=tercero
$ miArray[3]=cuarto
Acceder a uno de los elementos del array:
$ echo ${miArray[1]}
segundo
$ echo ${miArray[0]} blablabla ${miArray[2]}
primero blablabla tercero
Acceder a TODOS los elementos del array:
$ echo El contenido del array es: ${miArray[*]}
El contenido del array es: primero segundo tercero cuarto
Conocer el número de elementos del array:
$ echo El número de elementos del array es: ${#miArray[*]}
El número de elementos del array es: 4
- Anterior
- Siguiente