2011-11-10 22 views
12

Diziyi bir işleve nasıl iletirim ve neden bu işe yaramaz? Diğer sorulardaki çözümler benim için çalışmadı. Kayıt için diziyi kopyalamaya gerek yok, bu yüzden referans göndermeyi umursamıyorum. Tek istediğim bunun üstesinden gelmek.Bir dizi bas işlevine nasıl geçirilir

$ 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 

cevap

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

test ar 
+0

Pekala, = çalışır ar echo: test() { yerel ref = $ 1 [@] pkg için $ {! ref} içinde; yapılan "1 $ pkg 2" } echo ar = (ABC) deney dizisinde boşluk ile kırılgan olacaktır "$ {! Ref}" 'ya da başka bir döngü içinde pkg için – johndir

+1

kullanım 'ar elemanlar (örneğin, ar = (a "bc" d) '). –

+0

@glenn jackman: seconded – ata

2

ar testine ilk parametre değildir - O tüm parametreler olduğunu. İşlevinizde echo "[email protected]"'a sahip olmanız gerekir.

+0

Eh, bu Başlangıçta amaçlanan ne değildir, ama hile yaptın: Örneğin, yukarıda kullanarak "$ @" in for değişken testi() { ; yapılan "1 $ var 2" } (ABC) Test $ {ar [@]} – johndir

5

bu soru neredeyse iki yaşında farkındayım ama yukarıdaki cevapların hiçbiri aslında (@ata ve @ l0b0 verdiği cevapları) yapmak orijinal sorusuna gerçekçi cevap bulmaktan doğru bana yardımcı oldu. Soru, "bir diziyi bir bash işlevine nasıl iletebilirim?", @ata ise doğru olana yaklaştığında, yöntemin kendisi içinde kullanılacak gerçek bir diziyle bitmiyordu. Bir küçük ilaveler gereklidir. Şimdi

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

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

do_something_with_array anArray 

misiniz doğru çıktı:

4 
d 

Yani, varsayarak bu biz işlevi tanımlarsınız nasıl bir yerde işlev do_something_with_array() çağırmadan önce anArray=(a b c d) vardı

Eğer bir öğeniz bazı element (ler) varsa ray boşluk içerebilir, IFS'u SPACE dışındaki bir değere ayarlamalısınız, ardından işlevin dizini argümanlarını yerel dizilere kopyaladıktan sonra geri dönmelisiniz.

local tmp=$1[@] 
prevIFS=$IFS 
IFS=, 
local arrArg=(${!tmp}) 
IFS=$prevIFS 
İlgili konular