Percorrer uma lista de nomes definidos em uma variável

Percorrer uma lista de nomes definidos em uma variável
list="name1 name2 name3 name4"
dir="/test/dir"
for i in $dir/${list};do echo $i;done;

eu recebo

/test/dir/name1
name2
name3
name4

Eu quero

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

Observação: atualmente tenho uma solução funcional for i in ${list};do echo $dir/$i;done;, mas gostaria de saber por que o comando acima não está produzindo o resultado desejado e se há algum ajuste para fazê-lo funcionar. Obrigado

Responder1

mas gostaria de saber por que o comando acima não está produzindo o resultado desejado

A "$list"expansão como um argumento/elemento

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

Saída

<name1 name2 name3 name4>

Se você usar um array, ele expande cada elemento separado porIFS

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

Saída

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

Usando um array para a lista.

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

Saída

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

Ou se o objetivo é apenas adicionar o caminho, basta imprimir diretamente.

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

informação relacionada