Думаю, лучше всего будет создать каталог TEMP, а затем создать временные файлы в каталоге TEMP. Таким образом, вы можете без проблем удалить все файлы во временном каталоге, используя что-то вроде
rm ./TEMP/*
Вы хотите:
file_variables=(a b c d e f g h)
files=()
for var in "${file_variables[@]}"; do
file=$(mktemp) || exit
eval "$var=\$file"
files+=("$file") # or files=("${files[@]}" "$file") with older versions
done
something with "$a"
something with "$g"...
rm -f -- "${files[@]}"
Обратите внимание на цитирование. Например, в eval
следует передавать не расширение $(mktemp)
, а литеральную строку $(mktemp)
. В bash
большинство расширений также нужно заключать в кавычки.
Единственные, которые мы заключаем в кавычки, это a=$file
, b=$file
, которые выполняются eval
выше, поскольку split+glob не происходит (не может произойти) при присваивании скалярным переменным. Кавычки нужны для присваивания переменным массива, как в нашем files+=("$file")
.
Вы можете использовать nameref (Bash 4 +)
declare -a names=( a b c d e )
for n in "${names[@]}"; do
declare -n ref="$n"
ref="$( mktemp )"
done
for n in "${names[@]}"; do
declare -n ref="$n"
test -f "$ref" && rm "$ref"
done
nameref - это переменная, которая была объявлена с помощью declare -n
(или local -n
, или typeset -n
). Имя другой переменной присваивается ей после объявления ее как nameref. После этого использование значения переменной nameref будет таким же, как использование значения переменной с именем при создании nameref.
Если ваша оболочка bash достаточно новая (версия 4+), то я бы рекомендовал использовать ассоциативный массив для хранения имен файлов:
declare -A filenames
for i in "${FILES[@]}"; do
filenames[$i]=$(mktemp)
done
Тогда их легко удалить, когда вы закончите:
rm -- "${filenames[@]}"