기사 디렉토리
I. 개요
- 일부 명령 시퀀스를 반복적으로 호출하고 실행해야하기 때문에 Shell 함수도 자주 사용됩니다. 동일한 명령을 사용하여 매번 다시 작성하면 많은 양의 코드와 많은 줄이 생성됩니다.
- 이 문제를 해결하기 위해 명령 시퀀스 를 형식으로 함께 작성하여 재사용 할 수 있습니다.
- 따라서 Shell 함수의 본질은 재사용이 가능한 스크립트 코드이며,이 코드는 미리 작성되어 지정된 위치에 배치되어 사용시 바로 호출 할 수 있습니다.
2. 형식 정의
- [기능]은 선택적이며 기능의 기능을 나타내며 생략 할 수 있습니다.
- 함수 이름 뒤에 ()가오고 내부에 내용이 없습니다.
- 그리고 우리가 실행하는 명령의 순서는 {}에 있습니다.
- 가끔 많은 함수를 호출하면 한 번에 여러 개를 작성할 수 있습니다.
- 형식은 다음과 같습니다.
#格式一:
function 函数名 {
命令序列
}
#格式二:
函数名() {
命令序列
}
세, 함수 반환 값
- return은 함수를 종료 하고 스크립트의 $? 변수로 표시 할 수 있는 종료 값을 반환하는 것을 의미합니다.
- 사용 원리 :
- $? 변수는 실행 된 마지막 명령의 종료 상태 코드 만 반환하기 때문에 반환 값은 함수가 끝나 자마자 가져옵니다.
- 종료 상태 코드는 0 ~ 255 여야하며 초과 할 경우 256으로 나눕니다.
- 예 1 :
[root@localhost sh]# vim xc1.sh
#!/bin/bash
function xcf {
read -p "请输入:" a
a=$[$a*2]
return $a
}
xcf
echo $?
- 예 2 :
[root@localhost sh]# vim xc2.sh
#!/bin/bash
xcf() {
read -p "请输入:" a
a=$[$a*2]
echo $a
}
result=`xcf`
echo $result ##建议把值放入变量,方便以后调用
보충:
- {} 다음은 "주 명령"이며 가장 먼저 실행되는 명령은 다음과 같습니다.
- 함수 이름을 호출하면 위의 명령어 시퀀스의 코드가 실행됩니다.
네, 기능 매개 변수 전송
- 이름에서 알 수 있듯이 매개 변수를 전달하는 것은 매개 변수를 전달하는 것입니다.
- 이전에 위치 변수 에 대해 배웠 으므로 여기서는 반복하지 않겠습니다.
- 예는 다음과 같습니다.
[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
- 더 편리한 또 다른 방법
- 이 방법이 이해하기 더 쉽다고 생각합니다
- 전자의 방법은 더 인간적 이지만 우리 전문가에게는 후자의 방법이 더 빠르고 효율적으로 사용되는 경우가 많습니다.
- 고급 애플리케이션 시나리오는 종종 "인간화"가 많이 필요하지 않으며 모두 자동화됩니다.
다섯, 함수 변수의 범위
- 셸 스크립트의 함수는 현재 셸 환경에서만 유효합니다.
- 셸 스크립트의 변수는 기본적으로 전역입니다.
- 로컬 명령을 사용하여 변수를 함수로 제한하십시오.
- 예는 다음과 같습니다.
[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"
- 보시다시피 main 명령에 정의 된 c는 함수에서도 유효합니다.
- c를 먼저 출력하고 주 명령의 순서에주의를 기울이고 먼저 a와 c를 정의한 다음 zxc 함수를 정의하고 zxc 함수에서 a와 b를 다시 정의하고 원래 정의를 덮어 쓴 다음 zxc 아래에있는 이유 a와 b의 출력이므로 시퀀스는 다음과 같습니다.
[root@localhost opt]# ./xc1.sh
c等于9
a等于5
b等于6
- 함수에 의해 정의 된 값을 함수에 한정하려면 local 을 사용해야합니다.
- 함수에서만 적용되는 변수 를 로컬 변수라고도합니다 . 다음은 그 예입니다.
[root@localhost opt]# vim xc2.sh
#!/bin/bash
zxc() {
local i
i=8
echo "inside $i"
}
i=9
zxc
echo "outside $i"
- 내부와 외부는 구별하고 식별하기 쉽고 이해하기 위해 사용됩니다.
- 먼저 i = 9를 정의한 다음 함수 zxc를 출력하고, 함수에 i = 8을 정의하고, 8 안에 출력합니다. local이 여기에 추가되었으므로 함수에 정의 된 8은 함수에서만 유효하며 함수 외부의 $ i는 여전히 9 처음에 정의 됨
[root@localhost opt]# chmod +x xc2.sh
[root@localhost opt]# ./xc2.sh
inside 8
outside 9
- 인상을 더 깊게합시다
- 지역 변수와 전역 변수는 서로 다른 두 개의 변수로 서로 다른 값을 할당 할 수 있으며 동일한 이름을 가질 수 있습니다. 설명하려면 아래 예를 참조하십시오.
여섯, 재귀
- 함수는 직접 또는 간접적으로 자체 함수를 호출합니다.
- 할 말이 많지 않고 보여주기 시작
1. 팩토리얼
대중 과학
- 팩토리얼은 1808 년 Keston Kaman이 발명 한 산술 기호이며 수학적 용어입니다.
- 양의 정수의 계승은 숫자보다 작거나 같은 모든 양의 정수의 곱 이고 0의 계승은 1입니다.
自然数n的阶乘写作n!
n!=1×2×3×…×n
阶乘亦可以递归方式定义:
0!=1,n!=(n-1)!×n
n!=n(n-1)(n-2)…1
데모
2. 재귀 디렉토리
- 재귀의 본질 :
- 언제부터
- 언제 끝날까요
- 각 재귀에서 수행해야하는 작업
- 예는 다음과 같습니다.
- / 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" ""
##调用函数,第一个参数为要进行遍历的目录,第二个参数为格式设定,区分目录层级
- 하나 테스트
[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
.
..
...
....
.....略
일곱, 함수 라이브러리 생성
함수 라이브러리에는 함수 정의 만 포함되며 스크립트에는 함수 정의와 실행 코드가 모두 포함됩니다.
- 다음 기능을 구현하는 기능 라이브러리 정의
- 추가 기능
- 빼기 기능
- 곱셈 기능
- 분할 기능
- 먼저 기본 함수 라이브러리 파일을 정의하십시오.
[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
}
- 스크립트 정의
[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
- 하나 테스트