こんにちは。一時ファイルを作成したら削除したいです。配列に変数名があります。作成はうまくいきますが、削除に問題があります。ありがとう
FILES=( a b c d e f g h)
for i in "${FILES[@]}"; do
eval "$i"=`mktemp`
done
答え1
Bashシェルが十分に新しいもの(バージョン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
。なぜなら、スカラー変数に割り当てられても分割+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
local -n
namerefは(or、or)を使用して宣言された変数ですtypeset -n
。 namerefとして宣言されたときに割り当てられた他の変数の名前。その後、nameref変数は、namerefの作成時に使用されたnameref変数と同じ値として使用されます。