Bashスクリプトで他の変数名に基づいて変数への参照を作成しますか? [コピー]

Bashスクリプトで他の変数名に基づいて変数への参照を作成しますか? [コピー]

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

おすすめ記事