shell 中文件数组的长度不正确

Length of array of files not correct in shell

我有以下脚本:

#!/bin/sh
FILES=../folder/files/*

echo "Total files in array : ${#FILES[@]}"
for f in $FILES
do
  echo "Processing file $f"
done

../folder/files/ 中,我有 3 个文件,并且 for 循环正确地遍历了它们。但是,数组中的文件数不正确。它 returns 18 而不是 3.

我确定文件夹中没有任何其他文件。

具体来说,为了我的目的,输出是:

$ sh run_benchmark.sh 
Total files in array : 18
Running benchmark for file ../benchmark/cfg/2_150.cfg
Running benchmark for file ../benchmark/cfg/2_300.cfg
Running benchmark for file ../benchmark/cfg/2_500.cfg

怎么了?

谢谢!

除非出于某些特殊原因您需要数组,否则不要为数组而烦恼,只需执行以下操作:

for f in ../path/*
do
    echo "==$f=="
done

使用@EtanReisner 评论:

#!/bin/bash
FILES=(../benchmark/cfg/*)

n=0
for f in "${FILES[@]}"
do
    let n++
    echo "Processing file($n from ${#FILES[@]})  ==$f=="
done

不过,如果有人出于某种原因想要使用数组:

list=( $path/* )

假定名称中没有包含空格、制表符或换行符的有趣文件。

这一行 FILES=../folder/files/* 没有扩展 glob。

直到这一行 for f in $FILES.

,您才开始扩展 glob

我想说的是,当您编写 echo "Total files in array : ${#FILES[@]}" 时,您是在向 shell 询问字符串 ../folder/files/* 的长度,但事实似乎并非如此。我不确切知道 shell 在这里做什么(尝试将 FILES 用作数组并失败但获取一个元素(FILES 的值?)并报告 1?).

无论如何,如果你想在数组中进行 glob 扩展,那么你需要使用数组。

FILES=(../folder/files/*)

然后您可以使用 "${#FILES[@]}" 获取长度并使用 for f in "${FILES[@]}" 迭代数组的值。