2015-03-12 3 views
2

Я передаю пустой массив функции и внутри функции массив имеет один элемент, но элемент пуст.Баш, передающий массив функции вставляет пустой элемент

#!/bin/bash 
#ytest 
#============================================================== 
function ShowArray 
{ 
echo "in ShowArray" 

AlocalArray=("${!1}") 

#alternatively you could do it like that 
#echo "${AlocalArray[@]}"      #DEBUG 

echo "Showing content of array" 

local iMax 

    iMax=${#AlocalArray[*]} 

    echo "ARRAYCOUNT: $iMax" 
    for ((iItem=0; iItem < iMax ; iItem++)) 
    do 
     echo "ITEM: ${AlocalArray[$iItem]}" 
    done 
} 


declare -a AARRAY 
echo "${AARRAY[@]}"      #DEBUG 
iMax=${#AARRAY[*]} 

echo "HERE ARRAYCOUNT: $iMax ITEMS in ARRAY" 
ShowArray "$AARRAY" 

Из тела сценария я получаю:

HERE ARRAYCOUNT: 0 ITEMS in ARRAY 

Изнутри функции я получаю:

in ShowArray 
Showing content of array 
ARRAYCOUNT: 1 
ITEM: 

Что случилось с моим кодом? Заранее спасибо.

Отказ от ответственности: этот демонстрационный скрипт ничего не полезен и служит только для демонстрации неправильного поведения.

ответ

2

Это неправильный способ передачи массивов в BASH, а функция ShowArray не имеет доступа к тому же массиву, созданному снаружи.

Вот как вы можете передать массив в BASH (старые и новые версии)

# works for older BASH version 3 also 
ShowArray() { 
    echo "in ShowArray -----------------------" 
    AlocalArray=("${!1}") 
    declare -p AlocalArray 
    echo "Showing content of array" 

    local iMax=${#AlocalArray[@]}  
    echo "ARRAYCOUNT: $iMax" 
    for ((iItem=0; iItem < iMax ; iItem++)); do 
     echo "ITEM: ${AlocalArray[$iItem]}" 
    done 
} 

# works on BASH versions >4 
ShowArray1() { 
    echo "in ShowArray1 -----------------------" 
    declare -n AlocalArray="$1" 
    declare -p AlocalArray 
    echo "Showing content of array" 

    local iMax=${#AlocalArray[@]}  
    echo "ARRAYCOUNT: $iMax" 
    for ((iItem=0; iItem < iMax ; iItem++)); do 
     echo "ITEM: ${AlocalArray[$iItem]}" 
    done 
} 

declare -a AARRAY=(foo bar) 
declare -p AARRAY 
iMax=${#AARRAY[@]} 
echo "HERE ARRAYCOUNT: $iMax ITEMS in ARRAY" 
ShowArray "AARRAY[@]" 
ShowArray1 "AARRAY" 

Выходные:

declare -a AARRAY='([0]="foo" [1]="bar")' 
HERE ARRAYCOUNT: 2 ITEMS in ARRAY 
in ShowArray ----------------------- 
declare -a AlocalArray='([0]="foo" [1]="bar")' 
Showing content of array 
ARRAYCOUNT: 2 
ITEM: foo 
ITEM: bar 
in ShowArray1 ----------------------- 
declare -n AlocalArray="AARRAY" 
Showing content of array 
ARRAYCOUNT: 2 
ITEM: foo 
ITEM: bar 
+1

Благодарности анубхава. Вы сделали мой день. –

+0

Добро пожаловать, рад, что это помогло. – anubhava

+0

У меня есть еще один вопрос по тому же tolpic. Возможно, вы также можете мне помочь: http://stackoverflow.com/questions/29015565/bash-adding-a-string-with-a-space-to-an-array-adds-two-elements –

Смежные вопросы