유 닉 스 셸 사용자 정의 함수 소개 및 사용

6428 단어
1. 무 참 함수
매개 변수 가 없 는 함수 로 일부 기능 을 직접 호출 합 니 다.
함 수 는 스 크 립 트 에 작성 되 어 다른 명령 과 함께 저장 되 지만 함 수 는 스 크 립 트 의 시작 부분 에 정의 해 야 합 니 다.
즉, 함 수 를 포함 하 는 스 크 립 트 에서 모든 함 수 는 스 크 립 트 의 시작 부분 에 정의 해 야 합 니 다.
그리고 함 수 를 정의 한 후에 호출 하거나 다른 스 크 립 트 에서 이 정 의 된 함 수 를 참조 합 니 다.
실례 1. 다음은 간단 한 사용자 정의 함수 입 니 다. 1 부터 10 까지 의 합 을 구하 십시오.
스 크 립 트 실행:
sh no_param_test
1
2
3
4
5
6
7
8
9
10
Sum:55
2. 유 참 함수
매개 변 수 를 가 진 사용자 정의 함수, 고급 언어 (예 를 들 어 C, JAVA, C\# 등) 에서 매개 변 수 는 모두 함수 뒤의 괄호 안에 있 습 니 다.
셸 에 서 는 함수 내 에서 매개 변수 개 수 를 검사 합 니 다.함 수 를 호출 할 때 바로 뒤에서 파 라 메 터 를 따라 가면 됩 니 다.
매개 변수 가 몇 개 든 함수 명 뒤에 바짝 붙 어 있다.
1. 단일 매개 변수
인 스 턴 스 2, 스 크 립 트 는 다음 과 같 습 니 다.
pg no_param_test
#!/bin/ksh
#          
# author:_yeeXun
# date  :2013-3-4 8:37:29

no_param_test() {
SUM=0
#for i in { 1..10 }
for i in 1 2 3 4 5 6 7 8 9 10
do
  echo $i
  SUM=`expr $SUM + $i`
  i=`expr $i + 1`
  if [ $i -eq 11 ]; then
    echo "Sum:$SUM"
  fi
done
}
no_param_test
# EOF

이 함수 에서\# check params 부분 은 매개 변수 검 사 를 하고 있 습 니 다. 여기 $\# 입력 한 매개 변수 개 수 를 표시 합 니 다.다음은 이 스 크 립 트 를 실행 합 니 다:
sh direc_check Enter destination directory: test * * * * * * * test does not exist... creating it now * * * * * * * * * * * 다시 실행 할 때 같은 이름 을 입력 하면 이 디 렉 터 리 가 이미 존재 함 을 알려 줍 니 다.sh direc_check Enter destination directory:test test is a directory and exists in/usr/b4nx/user/ytcclb
현재 디 렉 터 리 에서 이 스 크 립 트 를 통 해 만 든 디 렉 터 리 를 awk 언어 로 볼 수 있 는 디 렉 터 리 를 추가 합 니 다.
pg direc_check
#!/bin/ksh

is_directory() {
_DIR_NAME=$1
# check params
if [ $# -lt 1 ]; then
  echo "is_directory:I need a directory name to check"
  return 1
fi

# check
if [ ! -d $_DIR_NAME ]; then
  return 1
else
  return 0
fi
}

error_msg() {
echo "**********"
echo $@
echo "**********"
  return 0
}

echo -n "Enter destination directory:"
read DIR
if is_directory $DIR
then 
  echo "$DIR is a directory and exists in $PWD"
else
  error_msg "$DIR does not exist ... creating it now"
  mkdir $DIR > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    error_msg "Could not create directory::chech it out!"
    exit 1
  else :
  fi
fi

# author:_yeeXun
# date  :2013-3-2 15:27:57
# EOF

2. 여러 개의 매개 변수
하나의 매개 변수 든 여러 개의 매개 변 수 를 검사 하여 판단 합 니 다. 여기 $\# 입력 한 매개 변수 개 수 를 표시 합 니 다.
$1 은 입력 한 첫 번 째 인 자 를 나타 내 고, $2 는 두 번 째 인 자 를 나타 내 며, $3 은 네 번 째 인 자 를 나타 내 는 것 으로 유추 된다.
다음은 문자열 을 캡 처 하 는 함수 입 니 다:
실례 3, pg chop
ls -l | awk '{if($0~/^d/) print $0}'
drwxr-xr-x   2 b4nx     group        512 Mar  2 15:32 call_fun_test
drwxr-xr-x   2 b4nx     group        512 Mar  2 15:04 test

이 스 크 립 트 는 함수 chop 에서 문자열 을 캡 처 하고 2 개의 인 자 를 각각 $1, $2 로 표시 합 니 다.
$1 은 절 단 된 문자열 을 표시 하고, $2 는 절 단 된 시작 위 치 를 표시 합 니 다.다음 실행: sh chop
Enter the string:string123
Enter the start position:5
ng123
sh chop
Enter the string:_yeexunInCSDN
Enter the start position:10
CSDN
3. 함수 반환 값
함수 의 반환 값 은 실행 함수 의 상 태 를 표시 합 니 다.
1, return 0: 정상 복귀.
2. return 1: 오 류 를 되 돌려 줍 니 다.
3、return  :마지막 명령 실행 상태 에서 반환 값 을 결정 합 니 다. $를 사용 할 수 있 습 니까?검사 하 다.
4. 함수 호출 1, 같은 스 크 립 트
스 크 립 트 에서 함 수 는 스 크 립 트 가 시작 되 자마자 정의 되 어야 호출 할 수 있 습 니 다.
같은 스 크 립 트 에서 맨 위 에 함 수 를 정의 하고 정의 한 후에 호출 합 니 다. 예 를 들 어 인 스 턴 스 1, 인 스 턴 스 2, 인 스 턴 스 3.
2. 각본 간
이 함수 들 을 같은 스 크 립 트 에 정의 하여 공공 적 으로 사용 하 는 함수 스 크 립 트 로 정의 한 다음 호출 해 야 할 스 크 립 트 에서 이 스 크 립 트 를 참조 하면 됩 니 다.
인용 방식 은 다음 과 같다. < dot > < space > < directory > < script >
인 스 턴 스 4, 함수 호출 - 크로스 스 크 립 트
함수 스 크 립 트:
#!/bin/ksh
# chop
# to call:chop string how_many_chars_to_chop
chop() {
_STR=$1
_CHOP=$2

# awk's substr starts at 0,wo need to increment by one
CHOP=`expr $_CHOP + 1`

# check we have two params
if [ $# -ne 2 ]; then
  echo "check_length:I need a string and how many characters to chop"
  return 1
fi

# check the length of the string first
_LENGTH=`echo $_STR | awk '{print length($0)}'`

if [ "$_LENGTH" -lt "$_CHOP" ]; then
  echo "The length of the string is short"
  return 1
fi

echo $_STR | awk '{print substr($1,'$_CHOP')}'
}

# call the function
echo -n "Enter the string:"
read STR
echo -n "Enter the start position:"
read LEN
chop $STR $LEN

# author:_yeeXun
# date  :2013-3-2 14:17:34
# EOF

이 스 크 립 트 의 함수 스 크 립 트 를 호출 합 니 다:
pg direc_check.sh
#!/bin/ksh

is_directory() {
_DIR_NAME=$1

# check params
if [ $# -lt 1 ]; then
  echo "is_directory:I need a directory name to check"
  return 1
fi

# check
if [ ! -d $_DIR_NAME ]; then
  return 1
else
  return 0
fi
}

error_msg() {
echo "**********"
echo $@
echo "**********"
  return 0
}

#       ::<<' ... '
:<<'
echo -n "Enter destination directory:"
read DIR
if is_directory $DIR
then
  echo "$DIR is a directory and exists in $PWD"
else
  error_msg "$DIR does not exist ... creating it now"
  mkdir $DIR > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    error_msg "Could not create directory::chech it out!"
    exit 1
  else :
  fi
fi
'
# author:_yeeXun
# date  :2013-3-2 15:27:57
# EOF

존재 하 는 디 렉 터 리 를 입력 할 때: sh funtest
Enter destination directory:test
test is a directory and exists in/usr/b4nx/user/ytcclb
존재 하지 않 는 디 렉 터 리 이름 입력:
sh fun_test Enter destination directory:dir_test ********** dir_test does not exist ... creating now **********
현재 디 렉 터 리 아래 의 모든 디 렉 터 리 이름 보기:
pg fun_test
#!/bin/ksh

# call the function outside the script is_drectory
# <dot><space><directory with functions><script with functions>
. $HOME/user/ytcclb/direc_check.sh

echo -n "Enter destination directory:"
read DIR
if is_directory $DIR
then
  echo "$DIR is a directory and exists in $PWD"
else
  error_msg "$DIR does not exist ... creating now"
  mkdir $DIR > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    error_msg "Could not create directory::check it out"
    exit 1
  else :
  fi
fi
# author:_yeeXun
# date  :2013-3-2 15:49:12
# EOF

--the end--

좋은 웹페이지 즐겨찾기