안녕하세요. 임시 파일을 생성한 후 삭제하고 싶습니다. 배열에 변수 이름이 있습니다. 만들기는 잘 작동하지만 삭제하는 데 문제가 있습니다. 감사해요
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 변수와 동일한 값으로 사용됩니다.