함수 매개변수를 전달하시겠습니까?

함수 매개변수를 전달하시겠습니까?

매개변수를 사용하는 함수를 어떻게 만들까요?

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. 그 이후의 모든 인수는 dBash 배열인 에 들어갑니다 .

연습으로 남겨두겠습니다.

불행하게도 쉘에는 매크로 확장 시간이 없습니다. 이것의 한 가지 큰 단점은 완전히 정적이더라도 함수가 호출될 때마다 코드가 생성된다는 것입니다.

Awk와 같은 일종의 전처리기를 작성하여 일부 명명된 함수 구문 설탕을 일반 쉘 코드로 변환할 수 있습니다.

관련 정보