2010-10-21 21 views

Trả lời

4

Các bash manual nói:

Không có giới hạn tối đa về kích thước của một mảng, cũng không phải bất kỳ yêu cầu mà thành viên được lập chỉ mục hoặc giao liên tục kế nhau.

Tôi tin rằng điều này được áp dụng, vì đối số chức năng được trình bày dưới dạng mảng.

10

Để truy cập vào đối số trong một chức năng, bạn có thể lặp qua chúng:

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

hoặc

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

hoặc truy cập vào lập luận cụ thể:

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

Con số này là khá lớn :

$ 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 

Như bạn có thể thấy, nó lớn hơn the kernel ARG_MAX limit, có ý nghĩa vì Bash không gọi execve(2) để gọi các hàm do Bash xác định.

Tôi nhận được malloc lỗi nếu tôi cố gắng thực hiện mở rộng chuỗi Bash ({1..NUM}) trong phạm vi 2^32, do đó có giới hạn cứng ở đâu đó (có thể khác trên máy của bạn), nhưng Bash quá chậm khi bạn ở trên 2^20 đối số, rằng bạn sẽ đạt đến giới hạn hiệu suất tốt trước khi bạn đạt đến giới hạn cứng.

Các vấn đề liên quan