매개변수를 사용하는 함수를 어떻게 만들까요?
function arg_example {
arg "c" # This is imaginary but it would return 'true' if it found the argument -c.
did_find_arg=$? # Get the previous function (arg)'s output.
if [$did_find_arg == 'true']; then
echo "Yes!"
else
echo "Not found."
fi
}
# Testing
arg_example # "Not found."
arg_example -c # "Yes!"
arg_example -k # "Not found."
또한 다음과 같은 키-값 함수의 값을 찾는 방법은 무엇입니까 --name
?
function hello {
echo "Hello, $--name!"
}
$1
편집: and 를 사용하는 방법을 알고 있지만 or $2
와 같은 선택적인 것을 얻는 방법을 알고 싶습니다 .-v
--version
답변1
명령줄 처리기능getopts
명령줄을 처리하는 것과 똑같은 방식으로 수행할 수 있습니다.스크립트. 주목해야 할 유일한 점은 OPTIND
이를 1로 재설정하거나 함수에 대해 로컬로 만들어야 한다는 것입니다.
#!/bin/bash
myfunc () {
local OPTIND
local do_c=0
local do_k=0
local opt
while getopts 'ck' opt; do
case $opt in
c) do_c=1 ;;
k) do_k=1 ;;
*) echo 'Error in command line parsing' >&2
return 1
esac
done
shift "$(( OPTIND - 1 ))"
if [ "$do_c" -eq 1 ]; then
echo 'Yes!'
else
echo 'Not found'
fi
}
myfunc
myfunc -c
myfunc -k
myfunc -a
위 스크립트는 다음을 생성합니다.
Not found
Yes!
Not found
script.sh: illegal option -- a
Error in command line parsing
관련된:
답변2
Bash를 위한 매우 간단한 명명된 매개변수 추출기:
#!/bin/bash
getargs()
{
local out=""
for argname in "$@"; do
out="${out}local $argname=\$1; shift;"
done
printf "%s" "$out"
}
testfun()
{
eval $(getargs a b c)
printf "a = %s, b = %s, c = %s\n" "$a" "$b" "$c"
}
testfun "$@"
인수가 함수의 동적 범위 내의 지역 변수가 되기를 원하므로 함수 호출이 될 수 없습니다 testfun
. getargs
그러나 getargs
작은번역가a b c
매개변수 사양을 쉘로 변환합니다.통사론, 위치 매개변수를 지역 변수에 넣기 위해 수동으로 추가할 코드를 생성합니다.
예를 들어, 출력
getargs a b c
소스 코드는 다음과 같습니다.
local a=$1; shift;local b=$1; shift;local c=$1; shift
그렇게 하면 eval
보이는 대로 작동합니다. 호출자의 컨텍스트에서 처음 세 개의 위치 인수를 a
, b
및 에 넣고 c
인수 목록 밖으로 이동합니다.
이제 우리는 다음 단계로 나아가서 "멋진 것"을 추가할 수 있습니다.
우선, 생성된 코드는 다음과 같습니다.확인하다실제로 세 가지 주장과 진단이 있습니다.
선택적 매개변수를 지원할 수 있습니다: ( getargs a b : c
또는 기타) 이는 필수임을 의미할 수 있지만 a
선택 사항 b
입니다 c
. 후행 매개변수도 지원할 수 있습니다. getargs a b : c . d
처음 두 개의 매개변수(필수)를 로컬로 생성한 a
다음 b
, 있는 경우 세 번째 매개변수를 입력할 수 있습니다 c
. 그 이후의 모든 인수는 d
Bash 배열인 에 들어갑니다 .
연습으로 남겨두겠습니다.
불행하게도 쉘에는 매크로 확장 시간이 없습니다. 이것의 한 가지 큰 단점은 완전히 정적이더라도 함수가 호출될 때마다 코드가 생성된다는 것입니다.
Awk와 같은 일종의 전처리기를 작성하여 일부 명명된 함수 구문 설탕을 일반 쉘 코드로 변환할 수 있습니다.