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[@]}"
迭代数组的值。
我有以下脚本:
#!/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
.
我想说的是,当您编写 echo "Total files in array : ${#FILES[@]}"
时,您是在向 shell 询问字符串 ../folder/files/*
的长度,但事实似乎并非如此。我不确切知道 shell 在这里做什么(尝试将 FILES
用作数组并失败但获取一个元素(FILES
的值?)并报告 1
?).
无论如何,如果你想在数组中进行 glob 扩展,那么你需要使用数组。
FILES=(../folder/files/*)
然后您可以使用 "${#FILES[@]}"
获取长度并使用 for f in "${FILES[@]}"
迭代数组的值。