【问题标题】:bash array syntax and loops, please explain [duplicate]bash数组语法和循环,请解释[重复]
【发布时间】: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

标签: arrays bash quotes


【解决方案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,我就不会看到它,或者知道它是这样工作的。谢谢。
猜你喜欢
  • 2017-09-20
  • 2016-04-24
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
相关资源
最近更新 更多