如何在函数声明内使用位置参数(从命令行给出)?
在函数定义内部时,$1 和 $2 是函数本身唯一的位置参数,而不是全局位置参数!
答案1
调用者作用域的位置参数在函数中不可用。您需要调用者以一种或另一种方式将它们传递给函数。
在 中bash
,这可以通过数组来完成(但要注意,除 in 之外的数组从索引 0"$@"
开始bash
,而不是 1(与 中 类似ksh
,但与所有其他 shell 相反))。
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 中,您可以使用 shell 变量 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