Несколько списков и несколько типов файлов в bash - PullRequest
0 голосов
/ 13 апреля 2020

Проблема

Существует проблема обработки данных, когда последовательность действий выполняется для разных файлов. Однако в процессе обработки различные классы файлов требуют специализации. Этапы обработки являются длинными и громоздкими, и цель состоит в том, чтобы создать и поддерживать один l oop. . В моих попытках был составлен основной список подсписков, который был задан для указания c действий элементы в списке.

Схемы c Пример

Ниже приведена минимальная версия проблемы. Классы файлов могут быть помечены суффиксом.

Типичные входные данные

export suffix=".png .svg"
export foo="a b c"
export bar="alpha beta chi"

Желаемые действия

В псевдокоде

loop over master list
    first sublist foo
        create file names: a.png b.png c.png
    second sublist bar
        create file names: alpha.svg beta.svg chi.svg

Дополнительный кредит

Вложенные счетчики будут хороши, так как списки длинные. Например, chi.svg будет шагом 2,3

.

1 Ответ

1 голос
/ 13 апреля 2020

Используйте nameref, eval или косвенное указание для имитации вложенного массива.

  1. nameref:
foo=(a b c)
bar=(alpha beta chi)

arrays=(foo bar)
suffix=(.png .svg)

declare -n arr
let i=0
for arr in "${arrays[@]}"; do
    for elem in "${arr[@]}"; do
        echo "${elem}${suffix[i]}" 
    done
    let i++
done

Это объявляет arr как nameref. Когда вы оперируете arr, вы фактически используете переменную, указанную значением arr.

Вы можете добавить счетчик для внутреннего l oop с помощью let j=0 и let j++, или выполните следующие действия:

for (( i = 0; i < ${#arrays[@]}; i++ )); do
    declare -n arr="${arrays[i]}"
    for (( j = 0; j < ${#arr[@]}; j++ )); do
        echo "${arr[j]}${suffix[i]}"
    done
done
eval:
foo=(a b c)
bar=(alpha beta chi)

suffix=(.png .svg)
arrays=(foo bar)

for (( i = 0; i < ${#arrays[@]}; i++ )); do
    eval "arr=( \${${arrays[i]}[@]} )"
    for (( j = 0; j < ${#arr[@]}; j++ )); do
        echo "${arr[j]}${suffix[i]}"
    done
done

Это оценивает строку arr=( \${foo[@]} ), которая создает массив arr с элементами foo.

косвенное обращение:
foo=(a b c)
bar=(alpha beta gama)

arrays=('foo[@]' 'bar[@]')
suffix=(.png .svg)

let i=0
for arr in "${arrays[@]}"; do
    for elem in "${!arr}"; do
        echo ${elem}${suffix[i]}
    done
    let i++
done

"${!arr}" относится к массиву foo или bar, но мы не можем индексировать его или получить его длину (или есть что-то я пропустил?). Таким образом, мы не можем использовать for (( j = 0; ... )) здесь.

Поиск Bash справочное руководство для соответствующей документации nameref, eval и косвенного обращения.

...