変数で定義された名前のリストを繰り返します。

変数で定義された名前のリストを繰り返します。
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"パラメータ/要素に拡張

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/"}"

おすすめ記事