扩展一个bash数组只会得到第一个元素。

19 浏览
0 Comments

扩展一个bash数组只会得到第一个元素。

我想用这个脚本将当前目录的文件放入一个数组中,并打印出每个文件:

#!/bin/bash
files=(*)
for file in ${files[@]}
do
    echo $file
done
# 这证明了数组中实际存在多个值 (*)
echo ${files[0]} ${files[1]}

输出结果:

echo.sh
echo.sh read_output.sh

有谁知道为什么在这个循环中只打印了第一个元素?

0
0 Comments

问题:扩展Bash数组只会给出第一个元素。

原因:使用$files会将数组扩展为第一个元素。尝试使用echo $files,它只会打印数组的第一个元素。同样的原因,for循环只会打印一个元素。

解决方法:为了扩展数组的所有元素,需要使用${files[@]}。在Bash数组中正确迭代元素的方式如下:

for file in "${files[@]}"

需要注意的是,双引号也应该被视为这个习惯用法的必要部分;如果没有双引号,数组元素中的某些字符(空格、通配符等)可能会产生奇怪的效果。

如果你想将数组扩展为一个字符串,shellcheck更倾向于使用"${files[*]}"

参考链接:stackoverflow.com/a/55149711/733092

0