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

时间:2015-02-04 18:00:47

标签: shell sh

我有以下脚本:

#!/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循环正确。但是,数组中的文件数不正确。它返回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

有什么问题?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

你不是要扩展glob,直到这一行for f in $FILES

我打算说,当你写echo "Total files in array : ${#FILES[@]}"时,你要求shell获取字符串../folder/files/*的长度,但似乎并非如此。我不确切地知道shell在这里做了什么(尝试使用FILES作为数组而失败但是获得一个元素(FILES的值?)并报告1 ?)。

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

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

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

答案 2 :(得分:0)

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

list=( $path/* )

假设名称中没有带空格,制表符或换行符的有趣文件。