【发布时间】: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