一時ファイル(配列の名前)の作成/削除[閉じる]

一時ファイル(配列の名前)の作成/削除[閉じる]

こんにちは。一時ファイルを作成したら削除したいです。配列に変数名があります。作成はうまくいきますが、削除に問題があります。ありがとう

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=$fileb=$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 -nlocal -nnamerefは(or、or)を使用して宣言された変数ですtypeset -n。 namerefとして宣言されたときに割り当てられた他の変数の名前。その後、nameref変数は、namerefの作成時に使用されたnameref変数と同じ値として使用されます。

関連情報