함수 정의에서 위치 매개변수 사용

함수 정의에서 위치 매개변수 사용

함수 선언 내에서 위치 매개변수(명령줄에서 제공)를 어떻게 사용합니까?

함수 정의 내에서 $1과 $2는 전역 위치 매개변수가 아닌 함수 자체의 유일한 위치 매개변수입니다!

답변1

호출자 범위 위치 매개변수는 함수에서 사용할 수 없습니다. 어떤 식으로든 함수에 전달하려면 호출자가 필요합니다.

에서는 bash배열을 사용하여 이 작업을 수행할 수 있습니다(그러나 를 제외한 배열은 1이 아닌 인덱스 0에서 "$@"시작합니다 bash( in 과 같지만 ksh다른 모든 쉘과 반대임).

f() {
  printf 'Caller $1: %s\n' "${caller_argv[0]}"
  printf '    My $1: %s\n' "$1"
}
caller_argv=("$@")
f blah

또는 추가로 전달하십시오.

f() {
  printf 'Caller $1: %s\n' "$2"
  shift "$(($1 + 1))"
  printf 'My $1: %s\n' "$1"
}

f "$#" "$@" blah

여기에는 $1호출자의 위치 인수 수가 포함되어 있으므로 f자체 인수가 시작되는 위치를 알 수 있습니다.

답변2

Bash에서는 쉘 변수 BASH_ARGV를 사용할 수 있습니다.

shopt -s extdebug
# create the array BASH_ARGV with the parameter of the script
shopt -u extdebug
# No more need of extdebug but BASH_ARGV is created

f() {
  printf 'Caller $1: %s\n' ${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}
  printf '    My $1: %s\n' "$1"
}
f blah

답변3

질문하신 내용이 무엇인지 잘 모르겠지만 다음 예를 보면 명확해질 수 있습니다.

$ cat script
#!/usr/bin/env bash

echo "Global 1st: ${1}"
echo "Global 2nd: ${2}"

f(){
    echo "In f() 1st: ${1}"
    echo "In f() 2nd: ${2}"
}

f "${1}" "${2}"

$ ./script foo bar
Global 1st: foo
Global 2nd: bar
In f() 1st: foo
In f() 2nd: bar

관련 정보