Durchlaufen einer Liste von Namen, die in einer Variablen definiert sind

Durchlaufen einer Liste von Namen, die in einer Variablen definiert sind
list="name1 name2 name3 name4"
dir="/test/dir"
for i in $dir/${list};do echo $i;done;

Ich bekomme

/test/dir/name1
name2
name3
name4

Ich will

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

Hinweis: Ich habe derzeit eine funktionierende Lösung for i in ${list};do echo $dir/$i;done;, würde aber gerne wissen, warum der obige Befehl nicht das gewünschte Ergebnis liefert und ob es eine Möglichkeit gibt, ihn zum Laufen zu bringen. Danke

Antwort1

aber ich würde gerne wissen, warum der obige Befehl nicht das gewünschte Ergebnis liefert

Die "$list"Erweiterung als ein Argument/Element

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

Ausgabe

<name1 name2 name3 name4>

Wenn Sie ein Array verwenden, wird jedes Element einzeln erweitert umIFS

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

Ausgabe

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

Verwenden eines Arrays für die Liste.

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

Ausgabe

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

Oder wenn das Ziel nur darin besteht, den Pfad hinzuzufügen, können Sie einfach direkt drucken.

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

verwandte Informationen