함수 선언 내에서 위치 매개변수(명령줄에서 제공)를 어떻게 사용합니까?
함수 정의 내에서 $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