Funciones de Shell

Linux Shell permite a los usuarios definir funciones y luego llamarlas libremente en scripts de shell.

El formato de definición de funciones en shell es el siguiente:

[ function ] funname [()]

{

    action;

    [return int;]

}

Explicación:

  • 1. Puede usarfunction fun()definición, o también directamentefun()definir sin ningún parámetro.
  • 2. En cuanto al retorno de parámetros, se puede agregar explícitamente:returnreturn; si no se agrega, se tomará el resultado de la última ejecución del comando como valor de retorno.returnseguido de un valor numérico.n(0-255).

El siguiente ejemplo define una función y la llama:

Ejemplo

#!/bin/bash
# autor: Ejemplo
# url:www.example.com

demoFun(){
    echo ¡Esta es mi primera función de shell!
}
echo -----La función comienza a ejecutarse-----
demoFun
echo -----La función ha terminado de ejecutarse-----

Resultado de salida:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----

A continuación se define una función con unareturninstrucción return:

Ejemplo

#!/bin/bash
# autor: Ejemplo
# url:www.example.com

funWithReturn(){
    echo Esta función sumará los dos números ingresados...
    echo Ingrese el primer número:
    read aNum
    echo Ingrese el segundo número:
    read anotherNum
    echo Los dos números son respectivamente$aNumy$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo ¡La suma de los dos números ingresados es $?!

La salida es similar a la siguiente:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !

El valor de retorno de la función se obtiene después de llamar a la función mediante$? para obtenerlo.

Nota:Todas las funciones deben definirse antes de usarse. Esto significa que la función debe colocarse al comienzo del script; solo se puede usar cuando el intérprete de shell la encuentre por primera vez. Para llamar a una función, basta con usar su nombre.

Nota: returnLa instrucción return solo puede devolver un entero entre 0 y 255, y la suma de los dos números ingresados puede exceder este rango.

Para resolver este problema, puede modificar la instrucción return y usar directamente echo para generar la suma en lugar de return:

Ejemplo

funWithReturn(){
    echo Esta función sumará los dos números ingresados...
    echo Ingrese el primer número:
    read aNum
    echo Ingrese el segundo número:
    read anotherNum
    sum=$(($aNum + $anotherNum))
    echo Los dos números son respectivamente$aNumy$anotherNum !"
    echo $sum  # Muestra la suma de los dos números
}

Parámetros de función

En Shell, al llamar a una función se le pueden pasar parámetros. Dentro del cuerpo de la función, se obtiene el valor del parámetro mediante $n; por ejemplo, $1 representa el primer parámetro, $2 representa el segundo parámetro...

Ejemplo de una función con parámetros:

Ejemplo

#!/bin/bash
# autor: Ejemplo
# url:www.example.com

funWithParam(){
    echo ¡El primer parámetro es $1!
    echo ¡El segundo parámetro es $2!
    echo ¡El décimo parámetro es $10!
    echo El décimo parámetro es${10} !"
    echo El undécimo parámetro es${11} !"
    echo ¡El número total de parámetros es $#!
    echo ¡Genera todos los parámetros como una cadena $*!
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

Resultado de salida:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

Nota: $10 no puede obtener el décimo parámetro; para obtener el décimo parámetro se necesita ${10}. Cuando n>=10, se debe usar ${n} para obtener el parámetro.

Además, hay varios caracteres especiales que se usan para manejar parámetros:

Procesamiento de parámetros Descripción
$# Número de parámetros pasados al script o a la función
$* Muestra todos los parámetros pasados al script como una única cadena
$$ ID del proceso actual en ejecución del script
$! ID del último proceso que se ejecutó en segundo plano
$@ Igual que $*, pero al usarlo se agregan comillas y se devuelve cada parámetro entre comillas.
$- Muestra las opciones actuales que usa Shell; su función es la misma que la del comando set.
$? Muestra el estado de salida del último comando. 0 indica que no hay errores; cualquier otro valor indica que hay errores.
Otras extensiones