假设我在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
显然,这不是正确的代码,只是表达我想要的最直接的方法。我想弄清楚如何对变量名进行子字符串替换并使它按预期工作。
我建议改用关联数组:
#! /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在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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句