Пройтись по списку имен, определенных в переменной

Пройтись по списку имен, определенных в переменной
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/"}"

Связанный контент