Application de stratégie-fonction de script Shell (valeur de retour, passage de paramètres, portée de variable, récursivité et bibliothèque de fonctions)


I. Aperçu

  • La fonction Shell est également souvent utilisée par nous, car certaines séquences de commandes doivent être appelées et exécutées à plusieurs reprises. Si vous utilisez la même commande pour l'écrire à nouveau à chaque fois, cela entraînera une grande quantité de code et un grand nombre de lignes.
  • Pour résoudre ce problème, la séquence de commandes peut être écrite ensemble dans un format afin qu'elle puisse être réutilisée
  • Ainsi, l'essence de la fonction Shell est un morceau de code de script qui peut être réutilisé. Ce code est écrit à l'avance et placé dans une position désignée. Il peut être appelé directement lorsqu'il est utilisé.

2. Définition du format

  • [fonction] est facultative, indiquant la fonction de la fonction, cela peut être omis
  • Le nom de la fonction est suivi d'un (), il n'y a pas de contenu à l'intérieur
  • Et la séquence de commandes que nous exécutons est placée dans {}
  • Si parfois nous appelons beaucoup de fonctions, alors nous pouvons en écrire plusieurs à la fois
  • Le format est le suivant:
#格式一:

function 函数名 {
    
    
        命令序列
}


#格式二:

函数名() {
    
    
        命令序列
}


Trois, valeur de retour de fonction

  • return signifie quitter la fonction et retourner une valeur de sortie , qui peut être affichée par la variable $? dans le script
  • Principe d'utilisation:
    • La valeur de retour est prise dès la fin de la fonction, car la variable $? Ne renvoie que le code d'état de sortie de la dernière commande exécutée
    • Le code d'état de sortie doit être compris entre 0 et 255 et la valeur sera divisée par 256 si elle dépasse
  • Exemple 1:
[root@localhost sh]# vim xc1.sh

#!/bin/bash

function xcf {
    
    
        read -p "请输入:" a
        a=$[$a*2]
        return $a
}

xcf
echo $?

marque

  • Exemple deux:
[root@localhost sh]# vim xc2.sh

#!/bin/bash

xcf() {
    
    
read -p "请输入:" a
        a=$[$a*2]
        echo $a

}

result=`xcf`
echo $result        ##建议把值放入变量,方便以后调用

marque

supplément:

  • Après {} se trouve la "commande principale", la première à être exécutée est celle-ci
  • Après avoir appelé le nom de la fonction, le code de la séquence de commandes ci-dessus sera exécuté

Quatre, transfert de paramètres de fonction

  • Comme son nom l'indique, passer des paramètres, c'est passer des paramètres
  • Nous avons déjà appris les variables de position , je ne les répéterai donc pas ici
  • Les exemples sont les suivants:
[root@localhost sh]# vim xc3.sh

#!/bin/bash

sum() {
    
    

xcf=$[$1 + $2]
echo $xcf

}

read -p "输入第一个参数:" first
read -p "输入第二个参数:" second

sum $first $second        ##调用函数,传第一个以及第二个输入的值,传参给$1以及$2

marque

  • Un autre moyen plus pratique
  • Et je pense que cette façon est plus facile à comprendre
    marque
    marque
  • La première méthode est plus humaine, mais pour nous les professionnels, la dernière méthode est souvent utilisée plus rapidement et plus efficacement.
  • Les scénarios d’applications plus haut de gamme n’ont souvent pas besoin de tant d ’« humanisation », ils sont tous automatisés

Cinq, la portée des variables de fonction

  • Les fonctions des scripts Shell ne sont valides que dans l'environnement Shell actuel
  • Les variables des scripts Shell sont globales par défaut
  • Utilisez la commande locale pour limiter la variable à la fonction
  • Les exemples sont les suivants:
[root@localhost opt]# vim xc1.sh

#!/bin/bash

zxc() {
    
    

a=5
b=6
echo "c等于$c"
}

a=8
c=9
zxc
echo "a等于$a"
echo "b等于$b"
  • Comme vous pouvez le voir, le c défini dans la commande principale est également valide dans la fonction
  • Pourquoi produire d'abord c, faites attention à l'ordre dans la commande principale, définissez d'abord a et c, puis la fonction zxc, et redéfinissez a et b dans la fonction zxc, en écrasant la définition d'origine, puis sous zxc La sortie de a et b, donc la séquence est la suivante:
[root@localhost opt]# ./xc1.sh 
c等于9
a等于5
b等于6
  • Si nous voulons limiter les valeurs définies par la fonction à la fonction, nous devons utiliser local
  • Les variables qui ne prennent effet que dans les fonctions sont également appelées variables locales . Voici un exemple:
[root@localhost opt]# vim xc2.sh

#!/bin/bash

zxc() {
    
    
local i
i=8
echo "inside $i"

}

i=9
zxc
echo "outside $i"
  • L'intérieur et l'extérieur sont utilisés pour distinguer, faciles à identifier et à comprendre
  • Définissez d'abord i = 9, puis sortez la fonction zxc, définissez i = 8 dans la fonction et sortez à l'intérieur de 8. Parce que local est ajouté ici, le 8 défini dans la fonction n'est valide que dans la fonction, et le $ i en dehors de la fonction est toujours 9 défini au début
[root@localhost opt]# chmod +x xc2.sh 
[root@localhost opt]# ./xc2.sh 
inside 8
outside 9
  • Approfondissons encore l'impression
    marque
    marque
  • Les variables locales et les variables globales sont deux variables différentes, auxquelles des valeurs différentes peuvent être affectées, et elles peuvent avoir le même nom. Consultez l'exemple ci-dessous pour expliquer
    marque
    marque

Six, récursivité

  • Les fonctions appellent directement ou indirectement leurs propres fonctions
  • Pas grand chose à dire, commencez à montrer

1. Factorielle

Science populaire

  • Factorial est un symbole arithmétique inventé par Keston Kaman en 1808 et est un terme mathématique
  • La factorielle d'un entier positif est le produit de tous les entiers positifs inférieurs ou égaux au nombre , et la factorielle de 0 est 1.
自然数n的阶乘写作n!  
n!=1×2×3×…×n

阶乘亦可以递归方式定义:  
0!=1,n!=(n-1)!×n  
n!=n(n-1)(n-2)…1

Démo

marque
marque

2. Répertoire récursif

  • L'essence de la récursivité:
    • Depuis quand
    • Quand cela se finira-t-il
    • Que doit faire chaque récursivité
  • Les exemples sont les suivants:
  • Parcourez tous les fichiers sous / var / log
[root@localhost opt]# vim xc4.sh

#!/bin/bash

function list_files {
    
    
##定义递归遍历目录的函数
for f in `ls $1`
##循环遍历目录
do
        if [ -d "$1/$f" ]
        then
        ##判断若为目录则按格式输出目录名称并继续调用函数遍历这个目录
                echo "$2$f"
                list_files "$1/$f" "$2"
        else
        ##判断若为文件则直接按照格式输出文件名称
                echo "$2$f"
        fi
done
}

list_files "/var/log" ""
##调用函数,第一个参数为要进行遍历的目录,第二个参数为格式设定,区分目录层级
  • Tester un
[root@localhost opt]# ./xc4.sh 
anaconda
anaconda.log
ifcfg.log
journal.log
ks-script-1_XapN.log
ks-script-b5hX60.log
packaging.log
program.log
storage.log
syslog
X.log
audit
audit.log
boot.log
boot.log-20201222
.
..
...
....
.....略

Sept, créez une bibliothèque de fonctions

La bibliothèque de fonctions ne contient que la définition de la fonction, et le script contient à la fois la définition de la fonction et le code exécutable

  • Définir une bibliothèque de fonctions, qui implémente les fonctions suivantes
    • Fonction d'addition
    • Fonction de soustraction
    • Fonction de multiplication
    • Fonction de division
  • Définissez d'abord le fichier de bibliothèque de fonctions de base
[root@localhost opt]# vim xc5.sh

#!/bin/bash

jiafa () {
    
    
        result=$[$1 + $2]
        echo $result
}

jianfa () {
    
    
        result=$[$1 - $2]
        echo $result
}

chengfa () {
    
    
        result=$[$1 * $2]
        echo $result
}

chufa () {
    
    
if [ $2 -ne 0 ]
        then
                result=$[$1 / $2]
                echo $result
        else
                echo "$2不能等于0!"
fi
}

  • Définir le script
[root@localhost opt]# vim xc6.sh

#!/bin/bash

. /opt/xc5.sh        ##引入函数库文件

read -p "输入第一个参数值:" first
read -p "输入第二个参数值:" second

result1=`jiafa $first $second`
result2=`jianfa $first $second`
result3=$(chengfa $first $second)
result4=$(chufa $first $second)

echo $result1
echo $result2
echo $result3
echo $result4
  • Tester un
    marque

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51486343/article/details/111568761
conseillé
Classement