你如何在 bash 中创建一个临时文件数组?

Pet*_*ter 1 unix linux bash

我需要有多个临时文件。我决定数组最适合它,因为我确实创建了 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)

Joh*_*ica 6

您有几个语法错误,我已在下面标记:

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[@]}"扩展到数组中的所有项目。
  • 没有真正需要 micromanagemktemp的文件名生成。让它使用默认算法很好,因为它会尊重用户的$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)