쉘 스크립트 전략 기능 응용 프로그램 (반환 값, 매개 변수 전달, 변수 범위, 재귀 및 함수 라이브러리)


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
  • 하나 테스트
    표

추천

출처blog.csdn.net/weixin_51486343/article/details/111568761