【问题标题】:Why linux shell script array cannot iterate directly? [duplicate]为什么linux shell脚本数组不能直接迭代? [复制]
【发布时间】: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 将向您显示一个由您的文件名组成的字符串;在第二种情况下,你会看到你已经用文件名列表填充了一个数组

标签: linux bash shell ubuntu


【解决方案1】:

您需要注意的小改动..

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

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多