0

我正在寻找使用 Bash 从命令输出中填充多个数组的最佳方法。

我在这个阶段想出的解决方案是:

i=1
ls -al | while read line
do
            # Separate columns into arrays
            array_filetype[ $i ]=`echo $line | awk '{print $1}'`
            array_owner[ $i ]=`echo $line | awk '{print $3}'`
            array_group[ $i ]=`echo $line | awk '{print $4}'`
            echo "${array_filetype[$i]} - ${array_owner[$i]} - ${array_group[$i]}"
    (( i++ ))
done

输出是:

drwxrwxr-x - arsene - arsene
drwx--x--- - arsene - arsene
-rw-rw-r-- - arsene - arsene
-rw-rw-r-- - arsene - arsene
-rw-rw-r-- - arsene - arsene
-rw-rw-r-- - arsene - arsene
-rw-rw-r-- - arsene - arsene
-rwx------ - arsene - arsene
-rwx------ - arsene - arsene
-rwxr-xr-x - arsene - arsene
-rwx------ - root - root

提前致谢。

4

1 回答 1

3

您可以立即进行的改进是不要将整行作为一个整体来阅读:

i=1
ls -al | while read type links owner group rest-of-line-we-dont-care-about
do
     # Separate columns into arrays
     array_filetype[$i]=$type
     array_owner[$i]=$owner
     array_group[$i]=$group
     echo "${array_filetype[$i]} - ${array_owner[$i]} - ${array_group[$i]}"
    (( i++ ))
done

但是,一旦您想将数组用于不只是在循环内打印,您可能会突然停止工作。由于您将它们设置在子外壳中,因此父级不会受到影响。这是可能的修复方法之一:

i=1
while read type links owner group rest-of-line-we-dont-care-about
do
     # Separate columns into arrays
     array_filetype[$i]=$type
     array_owner[$i]=$owner
     array_group[$i]=$group
     echo "${array_filetype[$i]} - ${array_owner[$i]} - ${array_group[$i]}"
    (( i++ ))
done < <(ls -al)
于 2013-03-16T22:45:57.097 回答