Bashスクリプトに次の変数があるとしましょう。
path_family="/home/family"
path_family_log="/var/log/family.log"
path_friends="/home/friends"
path_friends_log="/var/log/friends.log"
path_pets="/home/pets"
path_pets_log="/var/log/pets.log"
次のようなことができるforループを作成したいと思います。
for TYPE in family friends pets
do
for FILE in $path_<TYPE>
do
cat $FILE >> $path_<TYPE>_log
done
done
明らかにこれは正しいコードではなく、私が欲しいものを表現する最も直接的な方法です。変数名に部分文字列置換を実行し、期待どおりに機能させる方法を理解しようとして頭を絞っています。
ベストアンサー1
代わりに連想配列を使用することをお勧めします。
#! /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