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

Posted

技术标签:

【中文标题】bash数组语法和循环,请解释[重复]【英文标题】:bash array syntax and loops, please explain [duplicate] 【发布时间】:2018-10-15 08:01:11 【问题描述】:

我对 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

【问题讨论】:

总是引用$List[@],否则没有理由使用@代替* 第一个和第三个根本没有涉及任何数组。不带引号的字符串扩展!= 数组。 ...另外,您在这里遇到了很多引用问题; shellcheck.net 会自动捕获它们,并提供带有解释的 wiki 链接。 @Charles。我认为您的 cmets 抓住了我不明白的症结所在。如果您能指出资源来解释“未引用的字符串扩展!= 数组”和“一堆引用问题”的含义,我将不胜感激。 根据下面的黑客评论,我现在可以看到引号不起作用。我只是不明白原因。 (编辑:对不起,我不知道如何让格式化工作) $ LISTA="item1 item2 item3" $ printf '%s\n' $LIST6[2]] $ LISTB=(item1 item2 item3) $ printf '%s\n' $LIST7[2]] item3 【参考方案1】:

前两个按预期工作,通过回显数组中的每个项目,后两个给出了意外的输出。

您的第四个循环相当于for f in $List[0]; do echo $f; done。这记录在man 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

【讨论】:

感谢您的意见。我已将 echo 替换为 printf 并引用了变量。 是的,我的意思是List="item1 item2 item3",我已经更新了答案。 (竖起大拇指) re: answer-as-edited.【参考方案2】:

前 3 个 sn-ps 应该可以工作,但是第 3 个的问题是 List="item1 item2 item3" 将用 item1 替换 "item1 item2 item3",这就是你得到输出的原因

item1
item2
item3
item2
item3 

修改变量名就可以了

List2="item1 item2 item3"   

在最后的 sn-p $List 中使用不带索引,这与引用数组 List 的第一个元素的内容相同。

【讨论】:

啊。我没有意识到那正在发生。如果我先运行#3,我就不会看到它,或者知道它是这样工作的。谢谢。

以上是关于bash数组语法和循环,请解释[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在bash'while read'循环中设置的变量在它之后未设置[重复]

在 awk 循环中访问 bash 数组

检查Bash数组中是不是存在元素[重复]

未找到 Bash 中的数组 [重复]

循环遍历 Bash 中的字符串数组?

数组作为 Bash 中函数的参数:仅返回第一个元素 [重复]