bash 数组语法和循环,请解释 [duplicate]

bash array syntax and loops, please explain [duplicate]

提问人:bigdoyle 提问时间:5/5/2018 最后编辑:John Kugelmanbigdoyle 更新时间:5/5/2018 访问量:203

问:

我对 bash 中的数组语法感到困惑。我通常使用引号将字符串括起来进行循环,但教程通常使用括号。对于踢球,我做了 4 个简单的循环。前两个通过回显数组中的每个项目来工作,正如我所期望的那样,后两个给出了意想不到的输出。

为什么会这样?

循环 #1

$ List="item1 item2 item3"
$ for f in $List; do echo ${f}; done
item1
item2
item3

循环 #2

$ List=(item1 item2 item3)
$ for f in ${List[@]}; do echo ${f}; done
item1
item2
item3

循环 #3

$ List="item1 item2 item3"
$ for f in ${List[@]}; do echo ${f}; done
item1
item2
item3
item2
item3

循环 #4

$ List=(item1 item2 item3)
$ for f in $List; do echo ${f}; done
item1
Arrays Bash 行情

评论

1赞 chepner 5/5/2018
始终引用 ,否则没有理由使用 代替 。${List[@]}@*
0赞 Charles Duffy 5/5/2018
第一个和第三个根本不涉及任何数组。不带引号的字符串扩展 != 数组。
0赞 Charles Duffy 5/5/2018
...另外,你在这里有很多报价问题;shellcheck.net 会自动捕获它们,并为 wiki 链接提供解释。
0赞 bigdoyle 5/5/2018
@Charles。我认为你的评论抓住了我不明白的症结所在。如果您能向我指出解释“未加引号的字符串扩展 != 数组”和“一堆引用问题”是什么意思的资源,我将不胜感激。
0赞 bigdoyle 5/5/2018
根据下面的 haccks 评论,我现在可以看到引号不起作用。我只是不明白原因。(编辑:对不起,我不知道如何让格式化工作) $ LISTA=“item1 item2 item3” $ printf '%s\n' ${LIST6[2]]} $ LISTB=(item1 item2 item3) $ printf '%s\n' ${LIST7[2]]} item3

答:

0赞 haccks 5/5/2018 #1

前 3 个片段应该可以工作,但第 3 个片段的问题是它将替换为 这就是您获得输出的原因List="item1 item2 item3"item1"item1 item2 item3"

item1
item2
item3
item2
item3 

更改变量的名称,它将起作用

List2="item1 item2 item3"   

在最后一个片段中,不带索引,这与引用数组的第一个元素的内容相同。$ListList

评论

0赞 bigdoyle 5/5/2018
啊。我没有意识到这正在发生。如果我先运行#3,我就不会看到它,也不会知道它是这样工作的。谢谢。
1赞 builder-7000 5/5/2018 #2

前两个通过回显数组中的每个项目来工作,正如我所期望的那样,后两个给出了意想不到的输出。

第四个循环等价于 。这记录在:for f in ${List[0]}; do echo ${f}; doneman bash

引用不带下标的数组变量等同于引用下标为 0 的数组。

第三个循环工作,但不打印原始数组。尝试:

List=(item1 item2 item3)     # Declares array List
printf '%s\n' "${List[@]}"
item1
item2
item3

List="item1 item2 item3"     # Overwrites first element of array... 
                             # ... equivalent to List[0]="item1 item2 item3"
printf '%s\n' "${List[@]}"
item1 item2 item3
item2
item3

评论

0赞 builder-7000 5/5/2018
感谢您的输入。我已替换并引用了该变量。echoprintf
0赞 builder-7000 5/5/2018
是的,我的意思是,我已经更新了答案。List="item1 item2 item3"
1赞 Charles Duffy 5/5/2018
(竖起大拇指)回复:编辑后回答。