【发布时间】:2021-08-03 03:32:42
【问题描述】:
我的工作目录中有一些文件如下:
20191101.data.lz4
20191104.data.lz4
20191105.data.lz4
20191106.data.lz4
20191107.data.lz4
20191108.data.lz4
20191111.data.lz4
20191112.data.lz4
20191113.data.lz4
20191114.data.lz4
20191115.data.lz4
20191118.data.lz4
20191119.data.lz4
现在我需要处理这些文件。如果我使用下面的命令定义一个数组,for 循环按我的预期工作,打印我的工作目录中的所有文件。
FILE_LIST=$(ls /my/work/dir)
for EACH_FILE in ${FILE_LIST}
do
echo $EACH_FILE
done
但如果我将数组定义如下,for 循环只会打印数组的第一个元素。
FILE_LIST=(20191101.data.lz4
20191104.data.lz4
20191105.data.lz4
20191106.data.lz4
20191107.data.lz4
20191108.data.lz4
20191111.data.lz4
20191112.data.lz4
20191113.data.lz4
20191114.data.lz4
20191115.data.lz4
20191118.data.lz4
20191119.data.lz4)
for EACH_FILE in ${FILE_LIST}
do
echo $EACH_FILE
done
但我发现我可以通过以下方式迭代第二个数组的每个元素:
for EACH_FILE in ${FILE_LIST[*]}
do
echo $EACH_FILE
done
在this question 中,大多数答案解释了如何以秒的方式使用for 循环,但没有解释为什么我的第一种方法不起作用。基于this answer 的情况B,我的第一种方法应该可以正常工作,但事实并非如此。
我仍然很困惑为什么第二个数组不能通过第一种方式迭代?
提前谢谢你!
【问题讨论】:
-
因为数组变量在 bash 中是这样工作的?
-
阅读 mywiki.wooledge.org/BashGuide/Arrays 可能会有所帮助,或者阅读官方 bash 手册的相关部分。
-
通过shellcheck.net 运行脚本也是发现问题的好方法(你有很多)。
-
@fajinyu :在第一种情况下,
FILE_LIST不是数组。在第二种情况下,它是。 -
使用
typeset -p <variable_name>查看变量的内容;在您的第一种情况下,typeset -p FILE_LIST将向您显示一个由您的文件名组成的字符串;在第二种情况下,你会看到你已经用文件名列表填充了一个数组