Funciones

Uno de las mayores utilidades que posee una shell es el permitirnos crear funciones para realizar tareas repetitivas fácilmente. El funcionamiento de estas funciones es parecido al que posee cualquier lenguaje de programación, en el cual se agrupan conjunto de comandos y se los llama por un nombre. El formato de las funciones es el siguiente

nombre_funcion(){
  primero_a_realizar
  segundo_a_realizar
                }

Estas funciones pueden ser definidas en cualquier lugar, incluso en la misma línea de comandos. Lo que habrá que recordar que hechas de esta forma se borraran de la memoria una vez que se a salido del shell. Una forma de hacer que queden disponibles en forma permanente es incorporarla en el archivo de inicio del shell, el .bash_profile, en el cual se pondrá la función. De esta forma podremos seguir utilizándola dado que será cargada en memoria cada vez que ejecute el shell. Veamos un ejemplo de una función simple

[shrek@pantano:~]$ que_tal()
> {
> echo "Hola $1, como estás?"
> }
[shrek@pantano:~]$ que_tal shrek
Hola shrek, como estás?

Aquí podemos ver dos factores en la creación de funciones. Primero se nombra a la función, seguida de un par de paréntesis "( )" con lo cual se indica al shell que lo que viene a continuación deberá ser tomado como una función. Inmediatamente después de los paréntesis se abrirá una llave "{", con lo que se indica que comienzan los comandos de la función. Al terminar se cierra la llave "}".

El otro punto es el reemplazo que efectúa el shell de las variables. Aquí la variable se asigna directamente y es un número que vendrá después del signo "$". Este número indica el número del argumento de que tomara su valor y que es dado al invocar a la función. En este caso su valor pasa a ser "shrek". Podremos asignar más variables de este tipo que serán tomadas de acuerdo a su valor numérico como el número del argumento.

[shrek@pantano:~]$ que_tal()
> {
> echo Hola $1 como estas?
> echo Espero que estés $2
> }
[shrek@pantano:~]$ que_tal shrek bien
Hola shrek como estas?
Espero que estés bien

Como en la programación, donde los límites entre las funciones y los procedimientos esta dada de acuerdo a la función que se esta cumpliendo, en el caso de las funciones del shell varía de acuerdo donde se encuentren guardadas. Una función está en memoria y puede ser cargada por el shell a partir de un archivo como el .bash_profile que es leído por él al iniciarse. En caso de que se creará un archivo aparte con permisos de ejecución, esta función pasaría a ser un script pero se necesitaría que se llame a la función desde dentro del mismo script. Volveremos a esto al tratar el tema de script de shell pero daremos un ejemplo para que se entienda mejor. Supongamos que creamos un archivo llamado saludo.sh y le damos permisos de ejecución con el comando chmod. El signo # representa un comentario

[shrek@pantano:~]$ cat > saludo.sh (1)que_tal() (2){
echo Hola $1 como estas?
echo Espero que estés $2
}
que_tal $1 $2 (3)
[shrek@pantano:~]$ chmod +x saludo.sh (4)
(1)
Con el comando cat y redirigiendo su salida se puede crear un archivo
(2)
A continuación se ingresa la función
(3)
Ahora la función es llamada desde dentro del script. Al finalizar se presionan las teclas Ctrl-D
(4)
Le damos los permisos de ejecución solo para nosotros

Lo ejecutamos, dado que estamos parados en el mismo directorio en que lo creamos, anteponiendo un punto y la barra para que el shell sepa que nos estamos refiriendo al directorio actual. El resultado es

[shrek@pantano:~]$ ./saludo.sh shrek bien
Hola shrek como estas?
Espero que estés bien