我需要有多个临时文件。我决定数组最适合它,因为我确实创建了 10 个临时文件,使用它们并删除了 10 个文件。通过研究,我想出了这个:
declare -A my_array
my_array=()
for i in `seq -w 1 10`
do
my_array[$i]= $(mktemp /tmp/$i.XXXX)
done
#Do stuff with the files in the array
for i in `seq -w 1 10`
do
rm my_array[$i]
done
Run Code Online (Sandbox Code Playgroud)
但是,这给了我错误:
./plot.sh: line 7: /tmp/01.PkUG: Permission denied
./plot.sh: line 7: /tmp/02.eFNZ: Permission denied And so on...
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为当我在没有循环的情况下创建 10 个文件时,它工作正常,但显然非常混乱:
tmpfile1=$(mktemp /tmp/data1.XXX)
tmpfile2=$(mktemp /tmp/data2.XXX)
And so on...
#And then remove
rm $tmpfile1
rm $tmpfile2
And so on....
Run Code Online (Sandbox Code Playgroud)
您有几个语法错误,我已在下面标记:
declare -A my_array
my_array=()
for i in `seq -w 1 10`
do
my_array[$i]=$(mktemp /tmp/$i.XXXX)
# ^^
# | no space
done
#Do stuff with the files in the array
for i in `seq -w 1 10`
do
rm "${my_array[$i]}"
# ^^^ ^^
# | | dollar sign and curly braces required, quotes recommended
done
Run Code Online (Sandbox Code Playgroud)
尝试使用ShellCheck检查您的脚本是否有错误。它具有比 shell 的内置诊断更好的诊断功能。它可以作为 CLI 工具下载,或者您可以将脚本粘贴到网站中。相当方便!
一些额外的改进:
declare -A当您拥有常规的非关联数组时,无需使用。for ((i = 0; i < n; i++))避免了对外部进程的不必要调用,例如seq.array+=(items...).rm包括的许多命令都包含文件名列表,您可以利用这些列表。"${array[@]}"扩展到数组中的所有项目。mktemp的文件名生成。让它使用默认算法很好,因为它会尊重用户的$TMPDIR设置,以防他们想要使用/tmp. (如果您确实想控制文件名,请使用--tmpdir以获得相同的行为。)files=()
for ((i = 1; i <= 10; i++)); do
files+=("$(mktemp)") # or: files+=("$(mktemp --tmpdir "$i".XXXX)")
done
# Do stuff with files in the array.
rm "${files[@]}"
Run Code Online (Sandbox Code Playgroud)