扩展bash数组只给出第一个元素。

25

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

#!/bin/bash

files=(*)

for file in $files
do
    echo $file
done

# This demonstrates that the array in fact has more values from (*)
echo ${files[0]}  ${files[1]} 

输出:

echo.sh
echo.sh read_output.sh

有人知道为什么在这个for循环中只打印出第一个元素吗?


1个回答

45

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

要展开数组的所有元素,你需要这么写:${files[@]}

在Bash数组中遍历元素的正确方法:

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

4
请注意,双引号也应被视为此习语的必要部分;如果没有它们,数组元素中的某些字符(空格、通配符等)可能会产生奇怪的效果。 - Gordon Davisson
2
如果您想将数组扩展成字符串,shellcheck 建议使用“${files[*]}”而不是其他方法。https://dev59.com/dLLma4cB1Zd3GeqPb4Ei#55149711 - Noumenon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接