2013-03-16 2 views
0

Я ищу лучший способ заполнить несколько массивов из вывода команды с помощью Bash.Заполните несколько массивов из вывода команды - 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 

Спасибо заранее.

Арсена

ответ

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) 
Смежные вопросы