首页 > 解决方案 > 为什么“echo $array”在这种特定情况下打印数组的所有成员,而不是像在任何其他情况下只打印第一个成员?

问题描述

我在尝试学习 bash 时遇到了一个非常奇怪的问题。

通常尝试通过像这样简单地解析变量名来打印回显只输出第一个成员Hello

#!/bin/bash

declare -a test

test[0]="Hello"
test[1]="World"

echo $test # Only prints "Hello"

但是,出于某种原因,这段代码会打印出给定数组的所有成员。

#!/bin/bash

declare -a files
counter=0

for file in "./*"
do
    files[$counter]=$file
    let $((counter++))
done

echo $files # prints "./file1 ./file2 ./file3" and so on

而且我似乎无法理解为什么它输出整个数组而不是只输出第一个成员。我认为这与我对 foreach 循环的使用有关,但我找不到任何具体的答案。这让我疯狂!

请发送帮助!

标签: arraysbash

解决方案


当您引用该模式时,您只在数组中创建了一个条目:

$ declare -p files
declare -a files=([0]="./*")

如果你引用了参数扩展,你会看到

$ echo "$files"
./*

没有引号,扩展受路径名生成的影响,因此echo接收多个参数,每个参数都被打印出来。

要构建您期望的数组,请在模式周围放置引号。路径名生成的结果不受进一步分词(或递归路径名生成)的影响,因此不需要引号。

for file in ./*
do
   ...
done

推荐阅读