2011-11-10 41 views
12

Làm cách nào để truyền một mảng vào một hàm và tại sao nó không hoạt động? Các giải pháp trong các câu hỏi khác không phù hợp với tôi. Đối với hồ sơ, tôi không cần phải sao chép mảng vì vậy tôi không nhớ đi qua một tham chiếu. Tất cả những gì tôi muốn làm là lặp lại nó.Làm cách nào để chuyển một mảng tới hàm bash

$ ar=(a b c) 
$ function test() { echo ${1[@]}; } 
$ echo ${ar[@]} 
a b c 
$ test $ar 
bash: ${1[@]}: bad substitution 
$ test ${ar[@]} 
bash: ${1[@]}: bad substitution 

Trả lời

11
#!/bin/bash 
ar=(a b c) 
test() { 
    local ref=$1[@] 
    echo ${!ref} 
} 

test ar 
+0

Alright, mà làm việc: test() { địa phương ref = $ 1 [@] cho pkg trong $ {! ref}; làm echo "1 $ pkg 2" làm } ar = (abc) kiểm tra ar – johndir

+1

sử dụng 'cho pkg trong "$ {! ref}" 'hoặc khác vòng lặp sẽ mong manh đối với khoảng trống trong mảng với các phần tử (ví dụ 'ar = (a" bc "d)'). –

+0

@glenn jackman: seconded – ata

2

ar không phải là tham số đầu tiên để kiểm tra - Đó là tất cả các thông số. Bạn sẽ phải echo "[email protected]" trong chức năng của mình.

+0

Vâng, đây không phải là những gì tôi dự định ban đầu, nhưng nó đã làm các trick: test() {var cho trong "$ @"; làm echo "1 $ var 2" làm } ar = (abc) kiểm tra $ {ar [@]} – johndir

5

Tôi nhận ra câu hỏi này là gần hai tuổi, nhưng nó đã giúp tôi hướng tới việc tìm ra câu trả lời thực tế cho câu hỏi ban đầu, mà không ai trong số các câu trả lời ở trên thực sự làm (@ata và câu trả lời @ l0b0 của). Câu hỏi đặt ra là "Làm cách nào để truyền mảng vào hàm bash?", Trong khi @ata gần đúng, phương thức của anh ta không kết thúc với một mảng thực sự để sử dụng trong chính hàm đó. Một bổ sung nhỏ là cần thiết.

Vì vậy, giả sử chúng ta có anArray=(a b c d) ở đâu đó trước khi gọi chức năng do_something_with_array(), đây là cách chúng tôi sẽ xác định các chức năng:

function do_something_with_array { 
    local tmp=$1[@] 
    local arrArg=(${!tmp}) 

    echo ${#arrArg[*]} 
    echo ${arrArg[3]} 
} 

Bây giờ

do_something_with_array anArray 

Sẽ một cách chính xác kết quả:

4 
d 

Nếu có khả năng một số yếu tố của bạn tia có thể chứa khoảng trống, bạn nên đặt IFS thành giá trị khác không phải là SPACE, sau đó quay lại sau khi bạn đã sao chép mảng của hàm thành (arg) vào mảng cục bộ. Ví dụ, bằng cách sử dụng trên:

local tmp=$1[@] 
prevIFS=$IFS 
IFS=, 
local arrArg=(${!tmp}) 
IFS=$prevIFS 
Các vấn đề liên quan