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数组语法和循环,请解释[重复]的主要内容,如果未能解决你的问题,请参考以下文章