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

时间:2018-05-04 19:00:36

标签: arrays bash quotes

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

为什么会这样?

LOOP#1

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

LOOP#2

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

LOOP#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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

前3个片段应该有效,但第3个问题是List="item1 item2 item3"会将item1替换为"item1 item2 item3",这就是你获得输出的原因

item1
item2
item3
item2
item3 

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

List2="item1 item2 item3"   

最后一个片段$List在没有索引的情况下使用,这与引用数组List的第一个元素的内容相同。