Répertoire d'articles
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 $?
- Exemple deux:
[root@localhost sh]# vim xc2.sh
#!/bin/bash
xcf() {
read -p "请输入:" a
a=$[$a*2]
echo $a
}
result=`xcf`
echo $result ##建议把值放入变量,方便以后调用
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
- Un autre moyen plus pratique
- Et je pense que cette façon est plus facile à comprendre
- 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
- 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
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
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