我有以下脚本:
#!/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
有什么问题?
谢谢!
答案 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/* )
假设名称中没有带空格,制表符或换行符的有趣文件。