変数に定義された名前のリストをループする

変数に定義された名前のリストをループする
list="name1 name2 name3 name4"
dir="/test/dir"
for i in $dir/${list};do echo $i;done;

私は

/test/dir/name1
name2
name3
name4

欲しい

/test/dir/name1
/test/dir/name2
/test/dir/name3
/test/dir/name4

注: 現在、有効な解決策がありますfor i in ${list};do echo $dir/$i;done;が、上記のコマンドで目的の結果が得られない理由と、それを機能させるための調整方法があるかどうかを知りたいです。よろしくお願いします。

答え1

しかし、上記のコマンドが期待どおりの結果をもたらさない理由を知りたいです

"$list"1つの引数/要素として展開する

list='name1 name2 name3 name4'; printf '<%s>\n' "$list"

出力

<name1 name2 name3 name4>

配列を使用する場合は、各要素を個別に展開します。IFS

list=(name1 name2 name3 name4); printf '<%s>\n' "${list[@]}"

出力

<name1>
<name2>
<name3>
<name4>

リストに配列を使用します。

list=(name{1..4})  ##: this expands to name1 name2 name4 because of brace expansion.
dir="/test/dir"

##: prefend "$dir/" in every element in the array list using /#/
for i in "${list[@]/#/"$dir/"}"; do 
  echo "$i"
done

出力

/test/dir/name1
/test/dir/name2
/test/dir/name3
/test/dir/name4

または、パスを追加するだけが目的であれば、直接印刷することもできます。

printf '%s\n' "${list[@]/#/"$dir/"}"

関連情報