【问题标题】:Unix Shell scripting (KSH)Unix Shell 脚本 (KSH)
【发布时间】:2014-01-23 10:03:12
【问题描述】:

我们可以在 Ksh 中创建动态数组吗? 比如,我们可以创建 i 范围为 1 到 5 的 array_$i[] 数组吗?即,array_1[]、array_2[]、array_3[]、array_4[] 和 array_5[]

这样我就可以遍历array_$i。 在 ksh 中可以吗?

【问题讨论】:

  • 如果你不能,你应该可以用eval模拟它。
  • 能否请您说明如何使用eval?另外,如何访问数组元素?我相信 ${array_$arr[$i]} 不起作用?
  • 如果您需要丰富的数据结构,shell 脚本语言是错误的选择。

标签: shell unix ksh


【解决方案1】:

你可以用eval做到这一点

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

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

    • 感谢 Henk 的建议,但是我们使用的 ksh 是 88 版本的。但是如果可能的话需要创建动态数组。使用 eval,赋值成为可能。但是,我仍然面临循环迭代的问题。
    • 只有 ksh88 的 Unixen 并不多。那是哪个平台?有些人,比如 IBM,两者都有,但有一个单独的 ksh93 二进制文件。无论如何,评估会工作,但我会转向 awk/perl/python/ksh93 - 任何可用的,即使我必须自己安装它。
    【解决方案3】:

    为了开发更多 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
    

    【讨论】: