【问题标题】:Access positional parameters from within a function in Bash从 Bash 中的函数中访问位置参数
【发布时间】:2026-02-04 18:20:05
【问题描述】:

在 bash 脚本文件中,我是否可以在具有参数的函数中使用命令行参数?

或者我是否需要将所有命令行参数分配给一个变量才能在函数体中访问它们?


echo $1   # may be "abc"

function f() { $1; }   # will be "def", but I need "abc" here

f "def"

PS:我在堆栈溢出时发现了一个similar question,但这个问题不涉及我在这里描述的问题?

【问题讨论】:

  • 只要使用f "$1"
  • AFAIK,没有办法从 shell 函数中访问脚本级命令行参数。 $1$@$* 的含义在函数中被函数的上下文覆盖。您可以在函数外部创建一个包含命令行参数的数组——args=("$@")——并在函数内引用它。

标签: linux bash shell


【解决方案1】:

为了记录,这在extdebug 模式下通过BASH_ARGCBASH_ARGV 变量是可能的,但是使用位置参数填充全局数组比这容易得多,并且没有副作用。

$ bash -O extdebug -s foo bar
$ f() {
>   declare -p BASH_ARGC BASH_ARGV
>   echo ${BASH_ARGV[BASH_ARGC[0] + BASH_ARGC[1] - 1]}
> }
$ f 42 69
declare -a BASH_ARGC=([0]="2" [1]="2")
declare -a BASH_ARGV=([0]="69" [1]="42" [2]="bar" [3]="foo")
foo

【讨论】:

    【解决方案2】:
    SCRIPT_ARG=$1
    
    function f() { 
      FUNC_ARG=$1; 
    
      echo $SCRIPT_ARG # Prints "abc"
      echo $FUNC_ARG   # Prints "def"
    
    }
    
    f "def"
    

    【讨论】: