在函数定义中使用位置参数

在函数定义中使用位置参数

如何在函数声明内使用位置参数(从命令行给出)?

在函数定义内部时,$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

相关内容