
list="name1 name2 name3 name4"
dir="/test/dir"
for i in $dir/${list};do echo $i;done;
yo obtengo
/test/dir/name1
name2
name3
name4
Quiero
/test/dir/name1
/test/dir/name2
/test/dir/name3
/test/dir/name4
Nota: Actualmente tengo una solución que funciona for i in ${list};do echo $dir/$i;done;
, pero me gustaría saber por qué el comando anterior no produce el resultado deseado y si hay algún ajuste para que funcione. Gracias
Respuesta1
pero me gustaría saber por qué el comando anterior no produce el resultado deseado
La "$list"
expansión como un argumento/elemento
list='name1 name2 name3 name4'; printf '<%s>\n' "$list"
Producción
<name1 name2 name3 name4>
Si usa una matriz, expande cada elemento por separadoIFS
list=(name1 name2 name3 name4); printf '<%s>\n' "${list[@]}"
Producción
<name1>
<name2>
<name3>
<name4>
Usando una matriz para la 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
Producción
/test/dir/name1
/test/dir/name2
/test/dir/name3
/test/dir/name4
O si el objetivo es simplemente agregar la ruta, puede imprimir directamente.
printf '%s\n' "${list[@]/#/"$dir/"}"