2014-01-23 7 views
0

Можем ли мы создать динамические массивы в Ksh? вроде, можем ли мы создавать массивы array_ $ i [], где i изменяется от 1 до 5? то есть array_1 [], array_2 [], array_3 [], array_4 [] и array_5 []Unix Shell scripting (KSH)

, чтобы я мог выполнять итерацию через array_ $ i. Возможно ли это в ksh?

+0

, если вы не можете, вы должны быть в состоянии эмулировать с помощью 'Eval '. – Barmar

+0

Не могли бы вы проиллюстрировать, как использовать eval? Также, как получить доступ к элементам массива? $ {array_ $ arr [$ i]} не работает, я верю? – user1999315

+1

Если вам нужны богатые структуры данных, язык сценариев оболочки является неправильным выбором. – chepner

ответ

0

Вы можете сделать это с eval

eval array_$i'[$j]=$val' 
eval 'echo $array_'$i 
0

В ksh93, вы можете создавать составные переменные. Это действительно хеши, а не массивы, но могут использоваться как таковые при использовании числовых индексов.

$ $ echo $KSH_VERSION 
Version JM 93u 2011-02-08 
$ a[1][1]=foo 
$ a[3][1]=bar 
$ print -C a 
([1]=([1]=foo) [3]=([1]=bar)) 
$ print -v a 
(
    [1]=(
        [1]=foo 
    ) 
    [3]=(
        [1]=bar 
    ) 
) 
$ print ${a[1][1]} 
foo 
$ print ${a[3][1]} 
bar 
+0

Спасибо за предложения Henk, но ksh, который мы используем, имеет версию 88. Но нужно создавать динамические массивы, если это возможно. используя eval, становится возможным назначать значения. Тем не менее, я все еще сталкиваюсь с проблемой для повторения в цикле. – user1999315

+0

Существует не так много Unixen, вокруг которых только ksh88. Какая платформа? Некоторые, такие как IBM, имеют оба, с отдельным бинарном ksh93. В любом случае, eval будет работать, но я перейду к awk/perl/python/ksh93 - независимо от того, что доступно, даже если мне придется самому установить его. –

0

разработать более ответ BAMAR здесь является примером того, как эти «массивы» могут быть использованы в KSH:

#!/usr/bin/ksh 

#-------------------------------------- 
# populate arrays 

for i in 1 2 3 4 5 ; do # here we will define/use 5 arrays 

    count=$RANDOM%10 # random array size up to 10 elements 

    while [[ $count -gt 0 ]]; do 

     let count=$count-1 
     eval my_arrays_${i}[$count]=$RANDOM # assigning some random numbers to the array elements 

    done 


done 

#-------------------------------------- 
# display arrays content 
for i in 1 2 3 4 5 ; do 
    idx=0 
    arr_name=my_arrays_${i} 
    arr_name_cnt="\${#$arr_name[*]}" 
    eval count=$arr_name_cnt # getting the array count of elements 
    echo "Array $arr_name has $count elements" 
    while [[ $idx -lt $count ]]; do # loop over array elements 
     arr_elem="\${${arr_name}[$idx]}" 
     eval arr_elem=$arr_elem # getting the actual value of the array element 
     echo "Element $idx: < $arr_elem > " 
     let idx+=1 
    done 
done 
Смежные вопросы