您好,我想创建临时文件然后删除它们。我有数组中的变量名称。创建工作正常,但删除它们时遇到问题。谢谢
FILES=( a b c d e f g h)
for i in "${FILES[@]}"; do
eval "$i"=`mktemp`
done
答案1
如果您的 bash shell 足够新(版本 4+),那么我建议使用关联数组来存储文件名:
declare -A filenames
for i in "${FILES[@]}"; do
filenames[$i]=$(mktemp)
done
完成后很容易删除它们:
rm -- "${filenames[@]}"
答案2
你想要:
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[@]}"
注意引用。例如,您不应传递$(mktemp)
to的扩展eval
,而应传递文字$(mktemp)
字符串。在 中bash
,您还需要引用大多数扩展。
我们唯一注意到引用的是a=$file
上面b=$file
运行的eval
, ,因为 split+glob 在分配给标量变量时不会(不能)发生。像我们的files+=("$file")
.
答案3
我认为最好的选择是创建一个 TEMP 目录,然后在 TEMP 目录中创建临时文件。这样你就可以删除临时目录中的所有文件,而不必担心使用类似的东西
rm ./TEMP/*
答案4
您可以使用 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
declare -n
nameref 是使用(or local -n
, or )声明的变量typeset -n
。另一个变量的名称在将其声明为 nameref 时分配给它。此后,使用 nameref 变量的值与创建 nameref 时使用 nameref 变量的值相同。