셸 고급 프로 그래 밍 - 셸 함수 1 편 (총 2 편)

4476 단어
함수 정의
다음 두 편 은 셸 함수 여행 을 시작 합 니 다.
  • 함 수 를 어떻게 정의 합 니까
  • 함수 에 어떻게 파 라 메 터 를 전달 하 는 지, 함수 가 이 매개 변 수 를 어떻게 처리 하 는 지
  • 함수 중의 변 수 는 어떤 작용 범위 가 있 는 지, 그리고 함수 중의 변수의 작용 범 위 를 어떻게 제한 하 는 지
  • 함수 가 어떻게 돌아 가 는 지, 함수 의 반환 값 을 어떻게 얻 는 지, 함수 의 반환 값 을 어떻게 테스트 하 는 지
  • 함 수 를 어떻게 호출 할 수 있 습 니까
  • 어떻게 배경 에서 함수 와 그 응용 을 실행 합 니까
  • 문법 양식 을 살 펴 보 자.
    #   
    function_name ()
    {
    
        #   ,          
        commands...
        #    ,return      。    return  ,                     ;    return  , return    n(0-255)
        [  return  int ; ]
    }
    

    물론 원 하신 다 면 함수 명 앞 에 키워드 function 을 추가 할 수 있 습 니 다. 이것 은 개인 적 인 취향 에 따라 추가 할 수 있 습 니 다.
    한 줄 에서 함 수 를 정의 할 수도 있 습 니 다. 이때 함수 체 내의 각 명령 사이 에는 반드시 분 호 를 사용 해 야 합 니 다.격 리, 문법 은 다음 과 같다. function name { command; command2; commandN; }함수 의 매개 변수/변수 와 반환 값
    함수 에 매개 변수 전달:
    name () {
    
    arg1=$1
    arg2=$2
    command  on  $arg1
    
    }
    

    함 수 는 자신의 명령 행 인자 가 있 습 니 다. 위치 매개 변 수 를 사용 하여 전달 하 는 매개 변 수 를 방문 하여 호출 함 수 를 사용 합 니 다. name foo bar
  • name = 함수 명
  • foo = 매개 변수 1 - 함수 에 전달 하 는 첫 번 째 매개 변수
  • bar = 매개 변수 2 - 함수 에 전달 되 는 두 번 째 매개 변수
  • 예 를 들 어 아래 의 이 밤:
    #!/bin/bash
    #====================================
    #
    #	FIREL:passed.sh
    #	AUTHOR:Xie_qi_chao
    #	CREATED:20/03/2019 
    #
    #====================================
    
    passed () {
        a=$1
        echo "passed(): \$0 is  $0"
        echo "passed(): \$1 is  $1"
        echo "passed(): \$a is  $a"
        echo "passed(): total args passed to me $#"
        echo "passed(): all  args (\$@) passed to me -\"$@\""
    }
    echo "**** calling  passed() first time ****"
    passed one
    echo "**** calling  passed() second time ****"
    passed  one  two  three
    
    

    실행 결 과 를 살 펴 보 자.
    [root@xieqc ~]# sh  passed.sh 
    **** calling  passed() first time ****
    passed(): $0 is  passed.sh
    passed(): $1 is  one
    passed(): $a is  one
    passed(): total args passed to me 1
    passed(): all  args ($@) passed to me -"one"
    **** calling  passed() second time ****
    passed(): $0 is  passed.sh
    passed(): $1 is  one
    passed(): $a is  one
    passed(): total args passed to me 3
    passed(): all  args ($@) passed to me -"one two three"
    

    로 컬 변 수 를 정의 합 니 다.
    #!/bin/bash
    #AUTHOR:Xie_qi_chao
    #TIME:20/03/2019
    d=/tmp/diskusage.log
    
    create_logfile () {
      local d=$1
      echo "create_logfile():d is set to $d"
    }
    d=/tmp/diskusage.log
    echo "Before calling create_logfile d is set $d"
    create_logfile  "/home/haha/diskusage.log"
    echo "after calling  create_logfile d is set  to $d"
    
    

    출력 결과 보기:
    [root@xieqc shell]# sh localfvar.sh
    Before calling create_logfile d is set /tmp/diskusage.log
    create_logfile():d is set to /home/haha/diskusage.log
    after calling  create_logfile d is set  to /tmp/diskusage.log
    

    위의 밤 에서 알 수 있 듯 이 local 명령 이 정의 하 는 변 수 는 스 크 립 트 내부 에서 만 유효 하 며 국부 변 수 를 위 한 것 으로 위의 스 크 립 트 와 결합 하여 종합 적 으로 비교 할 수 있 습 니 다.부분 변 수 는 함수 내부 에서 만 유효 하 며 전체 변 수 는 스 크 립 트 전체 에서 유효 합 니 다. 주로 local 명령 으로 부분 변 수 를 정의 하 는 지 여부 입 니 다.
  • local 명령 은 전역 변 수 를 국부 변수 로 변경 합 니 다
  • declare 명령 의 효과 와 마찬가지 로 변 수 를 전역 변수
  • 로 정의 합 니 다.
  • declare - g 옵션 이 변 수 를 정의 할 때 변 수 는 전역 변수
  • 한 함수 에서 변 수 를 직접 정의 하거나 declare - g 으로 변 수 를 정의 하 는 것 은 모두 변 수 를 전체 변수 로 정의 합 니 다.

  • 현재 함수 명 FUNCNAME
    작업 중 에 스 크 립 트 가 매우 길 고 많은 함 수 를 포함 하 며 함수 가 서로 호출 될 수 있 습 니 다. 가끔 스 크 립 트 를 디 버 깅 할 때 스 크 립 트 가 그 함수 로 실 행 됩 니 다. 어떻게 해 야 할 지 모 르 겠 습 니 다. FUNCNAME 를 이용 하면 스 크 립 트 가 호출 하 는 함수 '궤적' 을 알 수 있 습 니 다. 호출 함수 호출 함 수 를 보고 함수 궤적 을 표시 하 는 밤 을 볼 수 있 습 니 다.
    #!/bin/bash
    function fun_1 
    {
    	echo "Now ,function name is $FUNCNAME"
    	declare -p FUNCNAME
    }
    function fun_2
    {
    	echo "Now,function name is $FUNCNAME"
    	declare -p FUNCNAME
    	fun_1
    }
    
    fun_2
    
    

    실행 결 과 를 살 펴 보 자.
    [root@xieqc shell]# sh fun_FUNCNAME.sh
    Now,function name is fun_2
    declare -a FUNCNAME='([0]="fun_2" [1]="main")'
    Now ,function name is fun_1
    declare -a FUNCNAME='([0]="fun_1" [1]="fun_2" [2]="main")'
    
    

    위의 실행 결 과 를 통 해 스 크 립 트 가 실행 하 는 함수 호출 을 뚜렷하게 볼 수 있 습 니 다.
  • FUNCNAME 은 하나의 배열
  • 이다.
  • ${FUNCNAME [0]} 현재 실행 중인 함수 의 이름
  • ${FUNCTION [1]} 위 에 있 는 함수 의 이름 을 호출 합 니 다
  • 이런 식 으로 유추
  • 다음 편, 함수 의 실행, 제거, 명령 return, 재 귀 함수

    좋은 웹페이지 즐겨찾기