Pregunta 1¿Qué notación referencia el primer argumento dentro de una función de shell?
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
greet alice bob entran en $1 y $2, y el cuerpo de la función los usa para hacer su trabajo.| Sintaxis | Significado | Ejemplo |
|---|---|---|
name() { … } | Definir una función | greet() { echo "hi $1"; } |
name args | Llamar a una función | greet alice |
$1 | Referenciar el primer argumento dentro de la función | echo "name=$1" |
$2 | Referenciar el segundo argumento dentro de la función | echo "port=$2" |
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)
local solo es válida dentro de la función. Aunque tenga el mismo nombre, el valor exterior no cambia.| Sintaxis | Significado | Ejemplo |
|---|---|---|
local v=… | Crear una variable válida solo dentro de la función | local step=1 |
v=… | Una variable válida en todo el script | status=ready |
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
return entra en $?, y el if bifurca tratando 0 como éxito y un valor distinto de cero como fracaso.| Sintaxis | Significado | Ejemplo |
|---|---|---|
return 0 | Salir de la función como éxito | is_num 12; # éxito |
return 1 | Salir de la función como fracaso | is_num abc; # fracaso |
$? | Comprobar el valor de retorno de la función anterior | is_num 12; echo $? |
if name x; then … | Bifurcar directamente según el valor de retorno | if is_num "$v"; then …; fi |
Verificación de conocimientos
Responde cada pregunta una a una.
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?