Использование массива было бы намного лучшим способом хранения имен файлов:
dirname="/tmp/foo"
files=( a.txt b.txt c.txt )
out_files=( "${files[@]/#/$dirname/}" )
Давайте посмотрим, что теперь содержат эти массивы:
$ declare -p files out_files dirname
declare -a files='([0]="a.txt" [1]="b.txt" [2]="c.txt")'
declare -a out_files='([0]="/tmp/foo/a.txt" [1]="/tmp/foo/b.txt" [2]="/tmp/foo/c.txt")'
"${files[@]/#/$dirname/}"
довольнохитрое расширение параметра :
${parameter/pattern/string}
заменяет первое вхождение шаблона на указанную строку - если pattern начинается с
#
, то сопоставление будет привязано к началу значения $ параметра - , поэтому я сопоставляю пустая строка в начале значения и замена этой пустой строки значением $ dirname и литеральной косой чертой
- if параметр - это расширение массива, тогда замена шаблона будет происходить для каждого элемента массива.
Еще один момент, на который следует обратить внимание, не используйте ALLCAPS_VARNAMES: слишком просто переписать критически важную оболочкупеременные (например, $ PATH).