循环遍历变量中定义的名称列表

循环遍历变量中定义的名称列表
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/"}"

相关内容