Bash:Array包含的元素多于指定的元素

时间:2016-06-25 00:22:49

标签: arrays bash unset array-splice

我正在制作一个shell脚本来一次操作n个文件。 n个文件存储在一个数组中。但是,在while循环的第一次迭代之后,数组变得大于n。

即。如果我在695个文件上运行脚本,那么该数组将保存100个文件,然后在while循环中保存200,300,395,295,最后保持195个。

shopt -s nullglob
file_arr=(*.extension)
len_file_arr=${#file_arr[@]}
count_first=0
count_last=100

while (("$count_last" <= "$len_file_arr"))
do
        tf_array=("${file_arr[@]:${count_first}:${count_last}}")
        tf_comma_list=$(IFS=,; echo "${tf_array[@]}")
        echo ${#tf_array[@]}
        # manipulation files
        count_first=$((count_first+100))
        count_last=$((count_last+100))
        unset -v 'tf_array'
done
tf_array=("${file_arr[@]:${count_first}:${len_file_arr}}")
# manipulate left over files

我相信未设置的功能不如我期望的那样。但是,unset命令后的数组为空,我无法找到解释。这种数组行为的原因是什么,我该如何修复它?

1 个答案:

答案 0 :(得分:2)

bash数组切片具有以下语法:

${array_name[@]:start:count}

${array_name[@]:start:end}

你不应该像在这一行中那样递增count_last:

    count_last=$((count_last+100))

并更改while循环条件。 要么, 改变

    tf_array=("${file_arr[@]:${count_first}:${count_last}}")

    tf_array=("${file_arr[@]:${count_first}:100}")