arrays - 为什么“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 循环的使用有关,但我找不到任何具体的答案。这让我疯狂!
请发送帮助!
解决方案
当您引用该模式时,您只在数组中创建了一个条目:
$ declare -p files
declare -a files=([0]="./*")
如果你引用了参数扩展,你会看到
$ echo "$files"
./*
没有引号,扩展受路径名生成的影响,因此echo
接收多个参数,每个参数都被打印出来。
要构建您期望的数组,请在模式周围放置引号。路径名生成的结果不受进一步分词(或递归路径名生成)的影响,因此不需要引号。
for file in ./*
do
...
done
推荐阅读
- node.js - 有没有办法在vue中引用图像?
- javascript - 如何将 application/vnd.ms-excel 与非拉丁语言一起使用?
- python - 如何让 python 从列表中返回尽可能多的谜语
- wpf - UWP - 父控件拦截指针事件(其中子控件为 ScrollViewer)
- java - 如何在所有测试类完成后保存信息。Java Junit 5 Gradle
- python - 在 Python 中计算/估计 lognorm ppf 的快速方法
- python-3.x - pyttsx3 的问题:我的代码不说话
- vue.js - Fuse.js 抛出“未定义属性”错误并且搜索在页面加载时不起作用
- html - 在粘性元素上覆盖 CSS Stacking Context
- r - Geom_smooth 不在 ggplot2 上绘图