수색…


통사론

  • function 키워드를 사용하여 function 정의하십시오.

    function f {
    

    }

  • () 하여 함수를 정의하십시오.

    f(){
    

    }

  • function 키워드와 () 함수를 모두 정의하십시오.

    function f(){
    

    }

단순 함수

helloWorld.sh

#!/bin/bash

# Define a function greet
greet ()
{
    echo "Hello World!"
}

# Call the function greet
greet

스크립트를 실행하면 우리의 메시지가 보입니다.

$ bash helloWorld.sh
Hello World!

함수로 파일 소싱 하면 현재 bash 세션에서 사용할 수 있습니다.

$ source helloWorld.sh   # or, more portably, ". helloWorld.sh"
$ greet
Hello World!

일부 쉘에서 함수를 export 하여 하위 프로세스에 노출되도록 할 수 있습니다.

bash -c 'greet'  # fails
export -f greet  # export function; note -f
bash -c 'greet'  # success

인수가있는 함수

helloJohn.sh :

#!/bin/bash

greet() {
  local name="$1"
  echo "Hello, $name"
}

greet "John Doe"
# running above script
$ bash helloJohn.sh
Hello, John Doe
  1. 인수를 어떤 식 으로든 수정하지 않으면 local 변수에 복사 할 필요가 없습니다. echo "Hello, $1"echo "Hello, $1" 하면됩니다.

  2. $1 , $2 , $3 등을 사용하여 함수 내부의 인수에 액세스 할 수 있습니다.

    참고 : 인수가 9 $10 을 초과하면 작동하지 않습니다 (bash는 $ 1 0으로 읽음). ${10} , ${11} 등을 수행해야합니다.

  3. $@ 는 함수의 모든 인수를 나타냅니다.

    #!/bin/bash
    foo() {
      echo "$@"
    }
    
    foo 1 2 3 # output => 1 2 3
    

    참고 : 여기서는 "$@" 와 같이 항상 큰 따옴표를 사용해야합니다.

    따옴표를 생략하면 셸이 와일드 카드를 확장하고 (사용자가이를 피하기 위해 명시 적으로 인용 한 경우에도) 일반적으로 원치 않는 동작과 잠재적으로 보안 문제가 발생할 수 있습니다.

    foo "string with spaces;" '$HOME' "*"
    # output => string with spaces; $HOME *
    
  4. 기본 인수의 경우 ${1:-default_val} 합니다. 예 :

    #!/bin/bash
    foo() {
      local val=${1:-25}
      echo "$val"
    }
    
    foo     # output => 25
    foo 30  # output => 30
    
  5. 인수를 요구하려면 ${var:?error message}

    foo() {
      local val=${1:?Must provide an argument}
      echo "$val"
    }
    

함수의 반환 값

Bash의 return 문은 C- 함수와 같은 값을 반환하지 않고 반환 상태의 함수를 종료합니다. 해당 함수의 종료 상태라고 생각할 수 있습니다.

함수에서 값을 반환하려면 다음과 같이 값을 stdout 보냅니다.

fun() {
    local var="Sample value to be returned"
    echo "$var"
    #printf "%s\n" "$var"
}

자, 만약 당신이 :

var="$(fun)"

fun 의 출력은 $var 저장됩니다.

플래그 및 선택적 매개 변수 처리

getopts 내장 함수는 플래그 및 선택적 매개 변수를 수용하는 함수를 작성하는 함수 내부에서 사용될 수 있습니다. 이것은 특별한 어려움은 없지만 getopts가 접촉 한 값을 적절히 처리해야합니다. 예를 들어 stderr에 메시지를 쓰고 코드 1 또는 매개 변수로 -x 옵션에 제공된 임의의 코드로 종료하는 failwith 함수를 정의합니다.

# failwith [-x STATUS] PRINTF-LIKE-ARGV
#  Fail with the given diagnostic message
#
# The -x flag can be used to convey a custom exit status, instead of
# the value 1.  A newline is automatically added to the output.

failwith()
{
    local OPTIND OPTION OPTARG status

    status=1
    OPTIND=1

    while getopts 'x:' OPTION; do
        case ${OPTION} in
            x)    status="${OPTARG}";;
            *)    1>&2 printf 'failwith: %s: Unsupported option.\n' "${OPTION}";;
        esac
    done

    shift $(( OPTIND - 1 ))
    {
        printf 'Failure: '
        printf "$@"
        printf '\n'
    } 1>&2
    exit "${status}"
}

이 함수는 다음과 같이 사용할 수 있습니다.

failwith '%s: File not found.' "${filename}"
failwith -x 70 'General internal error.'

등등.

printf의 경우 변수는 첫 번째 인수로 사용하면 안됩니다. 인쇄 할 메시지가 변수의 내용으로 구성되어 있으면 다음과 같이 %s 지정자를 사용하여 인쇄해야합니다.

failwith '%s' "${message}"

함수의 종료 코드는 마지막 명령의 종료 코드입니다

이 예제 함수를 사용하여 호스트가 작동하는지 확인하십시오 :

is_alive() {
    ping -c1 "$1" &> /dev/null
}

이 함수는 첫 번째 함수 매개 변수로 지정된 호스트에 단일 핑을 전송합니다. ping 의 출력과 오류 출력은 모두 /dev/null 리디렉션되므로 함수는 아무 것도 출력하지 않습니다. 그러나 ping 명령은 성공시 종료 코드 0을 가지며 실패시 0이 아닌 값을 갖습니다. 이것은 함수의 마지막 (그리고이 예제에서는 유일한) 명령이므로 ping 의 종료 코드는 함수 자체의 종료 코드에 다시 사용됩니다.

이 사실은 조건문에서 매우 유용합니다.

예를 들어 호스트 graucho 가 작동중인 경우 ssh 를 사용하여 연결합니다.

if is_alive graucho; then
    ssh graucho
fi

또 다른 예 : 호스트 graucho 가 가동 될 때까지 반복적으로 확인한 다음 ssh 를 사용하여 연결합니다.

while ! is_alive graucho; do
    sleep 5
done
ssh graucho

함수 정의를 출력하십시오.

getfunc() {
    declare -f "$@"
}

function func(){
    echo "I am a sample function"
}

funcd="$(getfunc func)" 
getfunc func # or echo "$funcd"

산출:

func () 
{ 
    echo "I am a sample function"
}

명명 된 매개 변수를 받아들이는 함수

foo() {
  while [[ "$#" -gt 0 ]]
  do
    case $1 in
      -f|--follow)
        local FOLLOW="following"
        ;;
      -t|--tail)
        local TAIL="tail=$2"
        ;;
    esac
    shift
  done

  echo "FOLLOW: $FOLLOW"
  echo "TAIL: $TAIL"
}

사용 예 :

foo -f
foo -t 10
foo -f --tail 10
foo --follow --tail 10


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow