阵列在 AIX KSH 中不起作用

Posted

技术标签:

【中文标题】阵列在 AIX KSH 中不起作用【英文标题】:Arrays not working in AIX KSH 【发布时间】:2019-01-27 21:01:48 【问题描述】:

我有代码:

typeset -i idx=0
for each in `find . -name "*.log" -print `
do
        ILIST[idx]=`basename $each`
        idx=idx+1
        print :$ILIST[$idx]:$each:$idx  << does not print array element "::file1.log:o"
done    # for each

print $ILIST[@]  << prints entire array as expected
exit

那么,如何打印数组的单个元素?它适用于 HPUX。目标是并排创建 2 个数组,其中一个是文件名,另一个是创建时间,以便可以检查该文件的时间。

【问题讨论】:

您为数组元素idx 分配了一些东西,但随后您将其递增并打印元素idx+1,此时该元素始终为空。只需在循环的最后递增... 我通常建议通过使用符合 POSIX 的数学语法 (idx=$((idx + 1 ))) 来避免对 typeset -i 的依赖——这样读者就不必过多关注上下文确保您的代码正常工作。 不过,作为一个不同的问题 -- for each in $(find ...) 表面上是坏的;不处理带有空格、通配符等的文件或目录名称。请参阅UsingFind 了解更好的实践讨论——虽然它是一个以 bash 为中心的文档,但它确实讨论了显示的每个模式与不同 shell 和不同版本的兼容性find。同样,BashPitfalls #1 也适用于此。 【参考方案1】:

首先,我无法访问 AIX 机器来测试语法是否良好,但它在 Linux 实现上运行良好。

由于 KSH 支持复合变量 (93l +),我认为您最好使用它们而不是 2 个数组。

这是一段可以做你想做的事情的代码(至少我认为:))

    #!/bin/ksh

    typeset -L50 Col1
    typeset -L25 Col2

    #need to give the path as a parameter here since it's a test script
    DIRNAME=$1

    idx=0
    #The caveat for "find" still apply, so I'm assuming there is no special characters nor space in the filenames
    for file in $(find $DIRNAME -type f -name "*.log")
    do
    #Full path name
            LOGFILE[$idx].FName=$file
    #Only File name
            LOGFILE[$idx].BName=$(basename $file)
    #Last modification time since the beginning of time in second as it is easier to manage afterward. There is no creation date per se on Linux at least
            LOGFILE[$idx].MDate=$(stat -c %Z $file)
            ((idx++))
    done

    Col1="Filename"
    Col2="Date"

    print "$Col1$Col2\n"

    #Some prefer the syntax $#LOGFILE[@] but won't make a difference here since it's an indexed array.
    for ((i=0;i<$#LOGFILE[*];i++)); do
            Col1=$LOGFILE[$i].BName
    #Translating the seconds to human date. Format can of course be modified at will
            Col2=$(date -d @"$LOGFILE[$i].MDate" +"%Y%m%d%H%M")
            print "$Col1$Col2"
    done

希望对你有帮助。

【讨论】:

以上是关于阵列在 AIX KSH 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Aix grep 通配符不起作用

窗口挂钩在 Windows 7 中不起作用,但在 Windows xp 中不起作用

代码不起作用 - SetDwordValue 在 vbs 中不起作用

从 cuda 设备上的统一内存打印阵列不起作用

为啥 heightForHeaderInSection 在 iOS 4.3 中不起作用?

为啥 setVisibility() 在 onResumeFragments() 中不起作用?