Scripts
Un script es por norma general un fichero que contiene una agrupacion de ejecuciones que se quieren ejecutar de manera secuencial o conjunta.
Interprete
No todos los sistemas operativos contienen los mismos interpretes de shell, asi habras visto que los mas extendidos son /bin/sh y /bin/bash
La primera linea de un documento script es obligatoriamente el interprete que se debe usar para la ejecucion, de manera que si intentamos ejecutar un script para /bin/bash en un sistema operativo que no soporte /bin/sh nuestro script dara un error de ejecucion
Aqui tenemos un ejemplo muy sencillo:
Pasando argumentos a nuestro Shell Script
Es muy util ejecutar scripts, pero si ademas podemos leer los parametros de entrada pues mucho mejor. Vamos a ver como leer los argumentos de entrada de un script
Permisos de ejecucion script (chmod)
Cuando creamos un archivo, por defecto este no es un archivo ejecutable y debemos dar permisos de ejecucion en ese archivo para poder usarlo, para ello usamo chmod
touch myscript.sh # creamos el archivo que contendra el script
sudo chmod +x ./myscript.sh # Damos permisos de ejecucion (+x)
El array de Argumentos
En la ejecucion de un bash script, siempre tenemos contexto a la linea completa de ejecucion que se acaba de ejecutar.
Podemos acceder a cada termino de la ejecucion por su indice.
Imaginemos este script myscript.sh
#!/bin/bash
echo "estos son los terminos de este proceso de ejecucion"
echo "el primero es $1"
echo "el segundo es $2"
echo "el tercero es $3"
y lo ejecutamos pasandole argumentos y vemos el resultado:
Tambien tenemos una referencia a modo de array de todos estos parametros que es @
Cambiamos el script por :
#!/bin/bash
echo "estos son los terminos de este proceso de ejecucion"
echo "etodos los argumentos son[$@]"
# y podemos recorrerlos en modo normal
for var in "$@"
do
echo "$var"
done
Trabajando con parametros clave=valor
Hay veces que un script de ejecucion sencilla que no necesita parametros de configuracion (por ejemplo un script que pasa un string a uppercase).
Pero hay veces que nuestro script necesita se parametrizado para hacer una cosa y otra internamente.
Para ello podemos pasar argumentos en formato clave=valor y cargarlos como variable de entorno en la ejecucion y asi poder trabajar con ellos.
Imaginemos esta ejecucion
Nuestro script tiene parametros que determinan el modo de transformacion.
Para leer estos clave valor podemos hacer export de cada pareja de argumentos y luego usarlos en el script.
Nos quedara asi:
#!/bin/bash
# Recorremos los argumentos y los cargamos como variables globales en nuestro script
for var in "$@"
do
export $var
done
echo "el modo de transformacion es [$mode]"
echo "el valor a transformar es [$text]"
result=""
if [ "$mode" == "ToUpperCase" ] ;
then
result=$(echo $text | tr 'a-z' 'A-Z')
else
result="Not valid transformation mode value."
exit -1;
fi
echo "El resultado es: $result"
exit 0;
y la ejecucion sera:
$ ./transformText.sh mode=ToUpperCase text=hola
el modo de transformacion es [ToUpperCase]
el valor a transformar es [hola]
HOLA
Trabajando con parametros complejos
Hay veces que nuestra ejecucion requiere de muchos parametros de configuracion y es tedioso pasarlos todos por linea de comandos.
Una opcion alternativa es agrupar todos esos clave valor en un archivo .properties (formado por claves valor) y que nuestro script solo pida el parametro de donde esta el fichero de configuracion.
Los ficheros properties (clave=valor) se pueden cargar directamente como variables de entorno usando el comando source mifichero.properties
Construimos nuestro fichero de configuracion, execution.properties:
Y cambiamos nuestro script, leemos el parametro y cargamos en memoria la configuracion desde el archivo y ejecutamos como anteriormente.
#!/bin/bash
# Recorremos los argumentos y los cargamos como variables globales en nuestro script
for var in "$@"
do
if [[ "$var" =~ configFile* ]]; then
export $var
fi
if [[ "$var" =~ "text" ]]; then
export $var # Tambien exportamos el valor de la cadena a transformar
fi
done
# Comprobamos que se ha cargado bien desde el fichero de configuracion
if [ -z "$configFile" ]
then
echo "No se ha especificado el parametro de configuracion"
exit -1;
else
source $configFile
echo "Loaded property mode=$mode"
echo "Loaded property reverse=$reverse"
echo "Loaded property argumentoC=$argumentoC"
fi
# EJECUTAMOS
result=""
if [ "$mode" == "ToUpperCase" ] ;
then
result=$(echo $text | tr 'a-z' 'A-Z')
else
result="Not valid transformation mode value."
exit -1;
fi
echo "El resultado es: $result"
exit 0;
y la ejecucion
$ ./transformText.sh mode=ToUpperCase text=hola configFile=./execution.properties
Loaded property mode=ToUpperCase
Loaded property reverse=false
Loaded property argumentoC=loquesea
El resultado es: HOLA
Hacer Prompt desde shell script
Para leer una interaccion de un script con un usuario usamos read:
#!/bin/bash
read -p "Please insert full path to values-api file: " definitionFile
echo "definitio file is $definitionFile"
Conclusion
Hemos visto de manera sencilla como pasar parametros a la ejecucion de un script , leerlo para poder hacer sus tareas con los argumentos de entrada. Hemos visto que si tiene una configuracion compleja podemos usar un fichero properties y un source.