批处理数组的索引顺序不正确

Indices of batch array not in the good order

我有 4 个文件 :

text1005.txt
text1007.txt
text1009.txt
text1012.txt

我创建列表:

FILES=$(find -type f -name "*txt")

arr=${FILES}

但是当我想打印索引时,它没有给出好的文件。例如,

echo ${arr[1]}

./text1009.txt

它应该给了我列表中的第一个文件 text1005.txt 。这将是有问题的,因为稍后,我将使用 $SLURM_ARRAY_TASK_ID 变量,所以我需要索引与好的文件匹配。

有什么建议吗?

首先,避免全大写变量。
二、

files=$(find -type f -name "*txt")

创建单个变量,而不是数组 -

$: echo "$files"
./text1005.txt
./text1007.txt
./text1009.txt
./text1012.txt

$:  echo "${#files[@]}"
1

要插入数组,您需要括号。

files=( $(find -type f -name "*txt") )

第三,find 不会隐式对其输出进行排序。
如果您需要明确排序的输出,请明确排序您的输出。 :)

files=( $(find -type f -name "*txt" | sort ) ) # sort has lots of options

如果只是对文件进行词法排序,这似乎有点矫枉过正,这是简单通配的默认输出。在您的 find 中,您明确地将文件限制为 -type f,这很好,但是由于您示例中的所有文件都是 *.txt(我认为这是文本文件),因此可能没有必要。让解释器处理它而不用启动三个(是的,三个)子进程。

$: files=( *txt )      # faster & easier to read
$:  echo "${files[@]}"
text1005.txt text1007.txt text1009.txt text1012.txt
$: echo "${#files[@]}"
4
$:  echo "${files[0]}"
text1005.txt
$:  echo "${files[2]}"
text1009.txt

这是你想要的吗?