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

问题描述:

bash函数可以接受的参数个数是有限的吗?可以将多少个参数传递给bash函数?

+0

我会说0或更多。 – leppie 2010-10-21 09:41:51

bash manual说:

有上的阵列的大小 没有最大限制,也不是 构件被索引或分配 连续的任何要求。

我相信这适用,因为函数参数是以数组的形式呈现的。

要访问函数的参数,你可以在它们之间迭代:

foo() { 
    for arg # "in [email protected]" is implied 
    do 
     echo $arg 
    done 
} 

bar() { 
    while [ $1 ] 
    do 
     echo $1 
     shift 
    done 
} 

或访问特定的参数:

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

的数量是相当大的:

$ 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 

正如您所看到的,它大于the kernel ARG_MAX limit,这很有意义,因为Bash不会调用execve(2)来调用Bash定义的函数。

我得到malloc失败,如果我尝试执行2^32范围内的Bash序列扩展({1..NUM}),所以有一个硬性限制的地方(可能你的机器上有所不同),但Bash是如此之慢,一旦你得到上述2^20个参数,在达到硬限制之前,你会达到性能极限。