Explicación detallada de las funciones de Shell (definición de función, llamada de función, variables de parámetros)

La esencia de una función de Shell es un fragmento de código de script que se puede reutilizar. Este código se ha escrito con antelación y se ha colocado en una ubicación designada. Se puede llamar directamente cuando se utiliza.

Las funciones en Shell  son similares a funciones en otros lenguajes de programación como C++ , Java , Python , C#, etc., pero difieren en los detalles de sintaxis.

El formato de sintaxis de la definición de la función Shell es el siguiente:

function name() {
    statements
    [return value]
}

 Descripción de cada parte:

  • functiones una palabra clave en Shell, utilizada específicamente para definir funciones
  • namees el nombre de la función
  • statementses el código que ejecutará la función, es decir, un conjunto de declaraciones
  • return valueIndica el valor de retorno de la función, donde return es la palabra clave de Shell, utilizada específicamente para devolver un valor en la función; esta parte se puede escribir o no.

La parte adjunta { }se llama cuerpo de la función. Llamar a una función en realidad ejecuta el código en el cuerpo de la función. 

A continuación se muestra un ejemplo de una función simple.

function hello() {
  echo "Hello $1"
}

En el código anterior, el cuerpo de la función $1representa el primer parámetro cuando se llama a la función. Al llamar, simplemente escriba el nombre de la función directamente y los parámetros siguen al nombre de la función.

Escritura simplificada de la definición de función.


Si le resulta problemático, no necesita escribir la palabra clave de función al definir la función: 

name() {
    statements
    [return value]
}

 Si escribe la palabra clave de función, también puede omitir los paréntesis después del nombre de la función:

function name {
    statements
    [return value]
}

Sugiero utilizar métodos de escritura estándar para que pueda "conocer el significado al ver el nombre" y comprenderlo de un vistazo. 

Llamada de función


Al llamar a la función Shell, puede pasarle parámetros o no. Si no se pasan parámetros, simplemente proporcione el nombre de la función directamente: 

name

 Si se pasan parámetros, varios parámetros se separan por espacios:

name param1 param2 param3

Independientemente del formato, no se requieren paréntesis después del nombre de la función.

A diferencia de otros lenguajes de programación, la función Shell no puede especificar parámetros cuando se define, pero puede pasar parámetros cuando se llama y recibirá los parámetros que se le pasen.

Shell tampoco limita el orden de definición y llamada: puede colocar la definición antes de la llamada o viceversa, colocar la definición después de la llamada.

 

 

variable de parámetro


Las variables de parámetros se pueden utilizar dentro del cuerpo de la función para obtener parámetros de función. Las variables de parámetros de la función son consistentes con las variables de parámetros del script.

  • $1~ $9: Del primero al noveno parámetro de la función.
  • $0: El nombre del script donde se encuentra la función.
  • $#: El número total de parámetros de la función.
  • $@: Todos los parámetros de la función, separados por espacios.
  • $*: Todos los parámetros de la función. Los parámetros $IFSestán separados por el primer carácter del valor de la variable. El valor predeterminado es un espacio, pero se puede personalizar.

Si la función tiene más de 9 parámetros, se puede ${10}hacer referencia al décimo parámetro en forma de , y así sucesivamente.

A continuación se muestra un script de ejemplo test.sh.

#!/bin/bash
# test.sh

function alice {
  echo "alice: $@"
  echo "$0: $1 $2 $3 $4"
  echo "$# arguments"

}

alice in wonderland

Ejecute el script y los resultados son los siguientes.

$ bash test.sh
alice: in wonderland
test.sh: in wonderland
2 arguments

En el ejemplo anterior, dado que la función alicesolo tiene el primer y segundo parámetro, el tercer y cuarto parámetro están vacíos.

A continuación se muestra un ejemplo de una función de registro.

function log_msg {
  echo "[`date '+ %F %T'` ]: $@"
}

Cómo usarlo es el siguiente.

$ log_msg "This is sample log message"
[ 2018-08-16 19:56:34 ]: This is sample log message

 

Demostración de ejemplo


1) Defina una función para generar la dirección del tutorial de Shell: 

#!/bin/bash

#函数定义
function url(){
    echo "http://c.biancheng.net/shell/"
}

#函数调用
url

 Resultado de ejecución:
http://c.biancheng.net/shell/

Puede poner la llamada delante de la definición, es decir, escribirla de la siguiente forma:

#!/bin/bash
#函数调用
url

#函数定义
function url(){
    echo "http://c.biancheng.net/shell/"
}

 2) Defina una función para calcular la suma de todos los parámetros:

#!/bin/bash
function getsum(){
    local sum=0
    for n in $@
    do
         ((sum+=n))
    done
    return $sum
}
getsum 10 20 55 15  #调用函数并传递参数
echo $?

Resultado de ejecución:
100

$@representa todos los parámetros de la función y $?representa el estado de salida (valor de retorno) de la función . En cuanto a cómo obtener los parámetros de la función, lo explicaremos en detalle en la sección " Parámetros de la función Shell ".

Aquí usamos la palabra clave return para devolver la $?suma de todos los números, y los idiomas de uso varían mucho, como lo analizaremos en Valores de retorno de funciones de Shell .

Inicialización del sistema de muestra


Este script se utiliza para trabajos de configuración relacionados con Linux recién instalado, como cambiar la fuente predeterminada de yum, optimizar el kernel del sistema, detener algunos servicios innecesarios del sistema, etc. Este script es especialmente adecuado para una gran cantidad de servidores de la serie CentOS recién instalados. Se aplica a Centos7 

shell>vim cenots_7_system_init.sh
#!/bin/bash
# Filename:    centos7-init.sh
# Author:      test
 
#判断是否为root用户
if [ `whoami` != "root" ];then
echo " only root can run it"
exit 1
fi
 
#执行前提示
echo -e "\033[31m 这是centos7系统初始化脚本,将更新系统内核至最新版本,请慎重运行!\033[0m" 
read -s -n1 -p "Press any key to continue or ctrl+C to cancel"
echo "Your inputs: $REPLY"
 
#1.定义配置yum源的函数
yum_config(){
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache
}
 
#2.定义配置NTP的函数
ntp_config(){
yum –y install chrony
systemctl start chronyd && systemctl enable chronyd
timedatectl set-timezone Asia/Shanghai && timedatectl set-ntp yes
}
 
#3.定义关闭防火墙的函数
close_firewalld(){
systemctl stop firewalld.service &> /dev/null 
systemctl disable firewalld.service &> /dev/null
}
 
#4.定义关闭selinux的函数
close_selinux(){
setenforce 0
sed -i 's/enforcing/disabled/g' /etc/selinux/config
}
 
#5.定义安装常用工具的函数
yum_tools(){
yum install –y vim wget curl curl-devel bash-completion lsof iotop iostat unzip bzip2 bzip2-devel
yum install –y gcc gcc-c++ make cmake autoconf openssl-devel openssl-perl net-tools
source /usr/share/bash-completion/bash_completion
}
 
#6.定义升级最新内核的函数
update_kernel (){
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
}
 
#执行脚本
main(){
    yum_config
    ntp_config
    close_firewalld
    close_selinux
    yum_tools
    update_kernel
}‘
main

Supongo que te gusta

Origin blog.csdn.net/qq_34556414/article/details/132807013
Recomendado
Clasificación