我可以将多少个参数传递给bash函数?

zed*_*doo 8 bash

bash函数可以接受的参数数量是否有限?

Pau*_*ce. 12

要访问函数中的参数,可以迭代它们:

foo () {
    for arg    # "in $@" is implied
    do
        echo $arg
    done
}
Run Code Online (Sandbox Code Playgroud)

要么

bar () {
    while [ $1 ]
    do
        echo $1
        shift
    done
}
Run Code Online (Sandbox Code Playgroud)

或访问特定参数:

baz () {
    # for arguments above $9 you have to use curly braces
    echo $1 $9 ${10} ${121375}
}
Run Code Online (Sandbox Code Playgroud)


unw*_*ind 5

bash的手册说:

数组的大小没有最大限制,也不要求成员被连续索引或分配.

我相信这是适用的,因为函数参数表示为数组.


Mic*_*pat 5

数量相当大:

$ display_last_arg() { echo "${@: -1}"; }
$ getconf ARG_MAX
262144
$ display_last_arg {1..262145}
262145
$ echo $(( 2**18 )) $(( 2**20 ))
262144 1048576
$ display_last_arg {1..1048576}
1048576
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它大于内核ARG_MAX限制,这是有道理的,因为Bash不会调用execve(2)来调用Bash定义的函数.

malloc如果我尝试{1..NUM}在2 ^ 32范围内执行Bash sequence expansion(),我会失败,所以某处有一个硬限制(可能在你的机器上有所不同),但是一旦你超过2 ^ 20个参数,Bash就会很慢,在达到硬限制之前,你会达到性能极限.