Linux Shell 의 Shell 함수 호출

3806 단어
함수 호출 하면 여러분 도 낯 설 지 않 을 거 라 고 믿 습 니 다. 그러나 Shell 을 처음 배 운 저 에 게 Shell 에서 함수 호출 방식 은 익숙 하지 않 습 니 다. 저도 많은 시행 착 오 를 겪 었 습 니 다. 매개 변 수 를 전달 할 때 '자 연 스 러 운' 오류 가 발생 했 고 저 에 게 많은 고생 을 했 습 니 다. 그래서 Shell 에서 함수 호출 방법 을 정리 해 보 겠 습 니 다.
1. Shell 에서 함수 의 정의
프로그램 과 관리, 모듈 화 를 편리 하 게 하고 코드 의 중복 을 줄 이기 위해 서 함 수 는 정말 좋 은 것 입 니 다.셸 에서 함수 의 정 의 는 두 가지 방법 이 있 는데 다음 과 같다.
function fname()
{
statements;
}
혹시
fname()
{
statements;
}
주의 하 세 요. () 안에 인자 가 없습니다. C 언어 처럼 () 에 인자 가 있 을 수 있 는 것 이 아 닙 니 다.
그러면 여러분 은 답답 할 것 입 니 다. 함수 호출 이 많 든 적 든 항상 매개 변수 가 필요 합 니 다. 그러면 이 매개 변 수 는 어떻게 전달 해 야 합 니까?사실 매개 변수 전달 방식 은 fname 입 니 다.(매개 변 수 를 전달 할 필요 가 없습니다) 또는 fname agr 1 arg 2 (두 개의 매개 변 수 를 전달 해 야 합 니 다).
2. 사용자 정의 함수 의 예
여러분 의 상황 이 어떤 지 모 르 겠 습 니 다. 어쨌든 처음부터 저 는 매우 어색 합 니 다. 왜냐하면 C 언어 에서 예 를 들 어 제 가 함수 int cmp 를 정의 하기 때 문 입 니 다.(int a, int b) 그러면 저 는 함수 에서 함수 헤더 에 명 시 된 변수 a 와 b 를 사용 할 것 입 니 다. 셸 에 서 는 매개 변 수 를 정의 하지 않 습 니 다. 그러면 제 함 수 는 이 두 개의 매개 변 수 를 사용 해 야 합 니 다. 어떻게 해 야 합 니까? 다음은 하나의 예 로 설명 하 겠 습 니 다.
[plain] view plain
copy
print ?
#! /bin/bash  
  • # Filename:LoopPrint.sh  

  •   
  • function LoopPrint()  

  • {  
  •     count=0;  

  •     while [ $count -lt $1 ];  
  •     do  

  •     echo $count;  
  •     let ++count;  

  •     sleep 1;  
  •     done  

  •     return 0;  
  • }  

  •   
  • read -p "Please input the times of print you want: " n;  

  • LoopPrint $n;  
    #! /bin/bash
    # Filename:LoopPrint.sh
    
    function LoopPrint()
    {
    	count=0;
    	while [ $count -lt $1 ];
    	do
    	echo $count;
    	let ++count;
    	sleep 1;
    	done
    	return 0;
    }
    
    read -p "Please input the times of print you want: " n;
    LoopPrint $n;

    먼저 이 프로그램의 기능 을 말 해 보 세 요. 숫자 n 을 입력 한 다음 0 부터 1 초 간격 으로 숫자 를 입력 하 는 것 입 니 다. 출력 n - 1 까지 입 니 다. 우선 프로그램 은 수학 을 입력 하고 함 수 를 호출 하여 출력 하 는 기능 을 요구 합 니 다.
    주석 1 의 한 마디 에 주의 하 십시오. 그 안에 변수 $1 이 있 습 니 다. 함 수 를 호출 할 때 매개 변수의 전달 방식, 즉 fname agr 1 arg 2 를 기억 하 셔 야 합 니 다. 여기 있 는 $1 은 첫 번 째 매개 변 수 를 나타 내 는 것 입 니 다. 이런 식 으로 유추 하면 $2 는 두 번 째 매개 변수 입 니 다. $3 은 세 번 째 매개 변수 이 고 $n 은 두 번 째 매개 변 수 를 나타 내 는 것 입 니 다.
    그래서 $1 은 변수 n 의 값 입 니 다. 알 겠 죠?
    보충 하 다
    $0: 스 크 립 트 자체 의 이름 입 니 다.
    $\ #: 스 크 립 트 에 전 달 된 매개 변수 개수 입 니 다.
    $@: 스 크 립 트 에 전 달 된 모든 인자 의 목록 입 니 다. 즉, "$1", "$2", "$3" 등 으로 확 장 됩 니 다.
    $*: 스 크 립 트 에 전 달 된 모든 매개 변 수 를 하나의 문자열 로 표시 합 니 다. 위치 변수 와 달리 매개 변 수 는 9 개 를 초과 할 수 있 습 니 다. 즉, "$1c $2c $3" 으로 확 장 됩 니 다. 그 중에서 c 는 IFS 의 첫 번 째 문자 입 니 다.
    $$: 스 크 립 트 가 실행 중인 현재 프로 세 스 ID 번호 입 니 다.
    $?: 마지막 명령 의 종료 상 태 를 표시 합 니 다. 0 은 오류 가 없 음 을 표시 하고 다른 것 은 오류 가 있 음 을 표시 합 니 다.
    특히 파 라 메 터 를 전달 할 때 (이 예 에서) LoopPrint $n 이 라 고 써 야 합 니 다. LoopPrint n 이 라 고 쓸 수 없습니다. 왜 요? 예 를 들 어 20 을 입력 하면 n 의 값 ($n) 입 니 다.전 자 는 n 의 값, 즉 20 을 함수 LoopPrint 에 전달 하고 후 자 는 함수 LoopPrint 에 문자 n 을 전달 합 니 다. 이 점 은 정적 언어 에서 함수 매개 변 수 를 전달 하 는 것 과 는 매우 다 릅 니 다. Shell 에서 변수의 사용 은 먼저 정의 할 필요 가 없 기 때문에 변 수 를 사용 하여 Shell 이 변수 임 을 알 리 고 값 을 전달 할 때 $n 을 사용 합 니 다.n 을 직접 사용 할 수 없습니다. 그렇지 않 으 면 n 을 하나의 문자 로 만 처리 할 수 있 습 니 다. 변수 가 아 닙 니 다.
    3. 역할 영역 문제
    함수 의 역할 영역 은 C / C + 언어 에서 의 역할 제약 과 같 습 니 다. 함수 의 정 의 는 반드시 함수 호출 문 앞 에 나타 나 야 합 니 다. 그러나 C / C + + 와 다른 것 은 변수의 역할 영역 문제 입 니 다. 본인 의 시험 을 통 해 주석 1 의 문 구 를 while [$count - lt $로 바 꿉 니 다.
    n ];또한 가능 합 니 다. 즉, 함수 가 이 파일 에 나타 난 모든 변 수 를 사용 할 수 있 습 니 다. 그러나 저 는 상기 예 에서 의 방법, 즉 while [$count - lt $1] 을 사용 하 는 것 을 권장 합 니 다.또한 함수 중의 변수 이외 의 변 수 를 함부로 사용 하지 마 세 요. 함수 호출 시 함수 밖 에 어떤 변수 가 존재 하 는 지 모 르 고 그 값 이 무엇 인지 모 르 기 때 문 입 니 다. 다른 사람 이 당신 의 함 수 를 사용 할 때 당신 이 함수 에서 사용 하 는 변 량 명 을 전달 할 것 이 라 고 보장 할 수 없습니다. 예 를 들 어 n. 다른 사람 이 사용 할 때 전달 할 수 있 는 것 은 바로 그 가 정의 한 변수 입 니 다. 예 를 들 어등급 을 계산 하 다

    좋은 웹페이지 즐겨찾기