Aprende leyendo en orden

Funciones — agrupar en un solo lugar lo que se repite

Este artículo forma parte del Curso de Linux, con el que dominarás desde cero habilidades prácticas de Linux, desde los comandos básicos hasta los scripts de shell.
Define lógica con name() { ... }, recibe argumentos con $1, mantén variables locales de la función con local y bifurca según el éxito con return y $? para reutilizar la misma lógica de validación, ilustrado y practicado en una terminal del navegador.

Poner nombre a un bloque de lógica — definir funciones y argumentos

En lugar de escribir la misma lógica una y otra vez, puedes envolverla en una función y llamarla por su nombre.

Defínela con name() { ... } y coloca el cuerpo entre { y }.

Después de definirla, basta con escribir name para ejecutar esa lógica.

Esto divide un script largo en unidades con sentido y solo corriges las cosas en un único lugar.

Para pasar valores a una función, añade los argumentos después del nombre al llamarla, como name foo bar.

Dentro de la función, $1 es el primer argumento y $2 el segundo (la misma notación que los parámetros posicionales del propio script).

Envuelve un argumento en comillas dobles como "$1" y incluso un valor con espacios se trata como un solo argumento.

greet() {                        # define una función
  echo "hello, $1"
}
greet alice                      # hello, alice
greet bob                        # hello, bob
Cómo una llamada se corresponde con los argumentos
greet alice bob$1 = alice$2 = bobusar $1 $2 en el cuerpo1.º2.ºdentro de greet
Los valores de greet alice bob entran en $1 y $2, y el cuerpo de la función los usa para hacer su trabajo.
SintaxisSignificadoEjemplo
name() { … }Definir una funcióngreet() { echo "hi $1"; }
name argsLlamar a una funcióngreet alice
$1Referenciar el primer argumento dentro de la funciónecho "name=$1"
$2Referenciar el segundo argumento dentro de la funciónecho "port=$2"

Crea un script de utilidad que agrupe la validación de entrada en una función y la reutilice.

① Abre validate.sh con vi validate.sh, presiona i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Define una función que reciba un valor, compruebe si está vacío e imprima el resultado. Referencia el argumento con $1 dentro de la función.

③ Llama a la función varias veces con valores diferentes.

④ Presiona Esc y guarda con :wq, luego añade permiso de ejecución y ejecuta el script para comprobar el resultado de cada llamada.

⑤ Si no estás seguro de qué escribir, puedes copiar el cuerpo del panel de respuesta y pegarlo en el modo de inserción de vi. (Ejecútalo correctamente y aparecerá la explicación).

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

Variables que viven solo dentro de una función — local

Cuando declaras local v=... dentro de una función, esa variable es válida solo dentro de la función y desaparece cuando la función termina.

Sin local, sobrescribes también una variable del mismo nombre fuera de la función, lo que provoca efectos secundarios inesperados.

Para reutilizar una función de forma segura como componente, haz local las variables de trabajo que usa internamente.

msg="outer"
show() {
  local msg="inner"            # variable solo dentro de la función
  echo "in func: $msg"
}
show                           # in func: inner
echo "outside: $msg"           # outside: outer (sin cambios fuera)
Qué alcanza a ver local
msg=outerecho "$msg"imprime outerlocal msg=innerecho "$msg"imprime innertodo el scriptdentro de la función (local)
Una variable normal es visible en todas partes, mientras que una variable local solo es válida dentro de la función. Aunque tenga el mismo nombre, el valor exterior no cambia.
SintaxisSignificadoEjemplo
local v=…Crear una variable válida solo dentro de la funciónlocal step=1
v=…Una variable válida en todo el scriptstatus=ready

Crea un script que haga local una variable de trabajo y confirme que no afecta al exterior.

① Abre scope.sh con vi scope.sh, presiona i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Define una variable fuera, luego define una función que declare una variable del mismo nombre con local y le dé un valor diferente.

③ Tras llamar a la función, imprime la variable exterior para confirmar que su valor no ha cambiado.

④ Presiona Esc y guarda con :wq, luego añade permiso de ejecución y ejecuta el script.

⑤ Si no estás seguro de qué escribir, puedes copiar el cuerpo del panel de respuesta y pegarlo en el modo de inserción de vi.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

Devolver éxito o fracaso — return y $?

Una función puede devolver un código de salida con return N.

Por convención 0 significa éxito y cualquier valor distinto de 0 significa fracaso, y justo después de llamarla puedes comprobar ese valor con $?.

Bifurcar directamente según el éxito de una función como if check "$x"; then ... hace que el flujo de validación y procesamiento sea más fácil de leer.

is_num() {
  case "$1" in
    *[!0-9]*|"") return 1 ;;     # falla si contiene un caracter no numérico o está vacío
    *) return 0 ;;
  esac
}
is_num 12; echo "12 -> $?"       # 12 -> 0
is_num abc; echo "abc -> $?"     # abc -> 1
De return a la bifurcación según $?
is_num "$1"return 0return 1camino de éxitocamino de fracasoun númerono es un número$? = 0 → éxito$? = 1 → fracaso
El valor de return entra en $?, y el if bifurca tratando 0 como éxito y un valor distinto de cero como fracaso.
SintaxisSignificadoEjemplo
return 0Salir de la función como éxitois_num 12; # éxito
return 1Salir de la función como fracasois_num abc; # fracaso
$?Comprobar el valor de retorno de la función anterioris_num 12; echo $?
if name x; then …Bifurcar directamente según el valor de retornoif is_num "$v"; then …; fi

Crea una función que decida si un valor es un número y un script que bifurque según su valor de retorno.

① Abre isnum.sh con vi isnum.sh, presiona i para entrar en modo de inserción y escribe #!/bin/sh en la primera línea.

② Define una función que compruebe si el valor recibido contiene solo dígitos, devolviendo return 0 si es un número y return 1 en caso contrario.

③ Coloca esa función directamente en una condición if e imprime un mensaje de éxito o de fracaso para varias entradas.

④ Presiona Esc y guarda con :wq, luego añade permiso de ejecución y ejecuta el script para comprobar los resultados.

⑤ Si no estás seguro de qué escribir, puedes copiar el cuerpo del panel de respuesta y pegarlo en el modo de inserción de vi.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Qué notación referencia el primer argumento dentro de una función de shell?

Pregunta 2¿Cuál es el ámbito de una variable declarada con local?

Pregunta 3¿Cuál comprueba el valor de retorno de la función más reciente?