수색…
통사론
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
인수를 어떤 식 으로든 수정하지 않으면
local
변수에 복사 할 필요가 없습니다.echo "Hello, $1"
를echo "Hello, $1"
하면됩니다.$1
,$2
,$3
등을 사용하여 함수 내부의 인수에 액세스 할 수 있습니다.참고 : 인수가 9
$10
을 초과하면 작동하지 않습니다 (bash는 $ 1 0으로 읽음).${10}
,${11}
등을 수행해야합니다.$@
는 함수의 모든 인수를 나타냅니다.#!/bin/bash foo() { echo "$@" } foo 1 2 3 # output => 1 2 3
참고 : 여기서는
"$@"
와 같이 항상 큰 따옴표를 사용해야합니다.따옴표를 생략하면 셸이 와일드 카드를 확장하고 (사용자가이를 피하기 위해 명시 적으로 인용 한 경우에도) 일반적으로 원치 않는 동작과 잠재적으로 보안 문제가 발생할 수 있습니다.
foo "string with spaces;" '$HOME' "*" # output => string with spaces; $HOME *
기본 인수의 경우
${1:-default_val}
합니다. 예 :#!/bin/bash foo() { local val=${1:-25} echo "$val" } foo # output => 25 foo 30 # output => 30
인수를 요구하려면
${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