Вместо этого я бы предложил использовать ассоциативные массивы:
#! /bin/bash -
typeset -A dir log # declare both variables as associative arrays
dir=(
[family]=/home/family
[friends]=/home/friends
[pets]=/home/pets
)
log=(
[family]=/var/log/family.log
[friends]=/var/log/friends.log
[pets]=/var/log/pets.log
)
for type in "${!dir[@]}"
do
cat -- "${dir[$type]}/somefile" >> "${log[$type]}"
done
("${!array[@]}"
является синтаксисом ksh для получения списка ключей массива (в произвольном порядке )).
Или более разборчиво в zsh (, который имел ассоциативные массивы за десятилетия до bash):
#! /bin/zsh -
typeset -A dir log
dir=(
family /home/family
friends /home/friends
pets /home/pets
)
log=(
family /var/log/family.log
friends /var/log/friends.log
pets /var/log/pets.log
)
for type in ${(k)dir}
do
cat -- $dir[$type]/somefile >> $log[$type]
done
В ksh93 (, из которого bash позаимствовал синтаксис ассоциативного массива ), вы также могли использовать ассоциативные массивы составных переменных:
#! /bin/ksh93 -
conf=(
[family]=(dir=/home/family; log=/var/log/family.log)
[friends]=(dir=/home/friends; log=/var/log/friends.log)
[pets]=(dir=/home/pets; log=/var/log/pets.log)
)
for type in "${!conf[@]}"
do
cat -- "${conf[$type].dir}/somefile" >> "${conf[$type].log}"
done