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

bash array syntax and loops, please explain

本问题已经有最佳答案,请猛点这里访问。

我对bash中的数组语法感到困惑。我通常使用引号将字符串括起来进行循环,但教程通常使用括号。为了踢我做了4个简单的环。前两个通过回显数组中的每个项,如我所预期的那样工作,第二个提供了意外的输出。

为什么会这样?

回路1

1
2
3
4
5
$ List="item1 item2 item3"
$ for f in $List; do echo ${f}; done
item1
item2
item3

回路2

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

回路3

1
2
3
4
5
6
7
$ List="item1 item2 item3"
$ for f in ${List[@]}; do echo ${f}; done
item1
item2
item3
item2
item3

回路4

1
2
3
$ List=(item1 item2 item3)
$ for f in $List; do echo ${f}; done
item1


The first two work as I expected by echoing each item in the array, the second two gave unexpected output.

第四个循环相当于for f in ${List[0]}; do echo ${f}; done。这在man bash中有记录:

Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 0.

第三个循环工作,但不打印原始数组。尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
List=(item1 item2 item3)     # Declares array List
printf '%s
'
"${List[@]}"
item1
item2
item3

List="item1 item2 item3"     # Overwrites first element of array...
                             # ... equivalent to List[0]="item1 item2 item3"
printf '%s
'
"${List[@]}"
item1 item2 item3
item2
item3


前3个片段应该可以工作,但第3个片段的问题是,List="item1 item2 item3"将用"item1 item2 item3"替换item1,这就是为什么您得到输出

1
2
3
4
5
item1
item2
item3
item2
item3

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

1
List2="item1 item2 item3"

在最后一个代码段中,使用$List而不使用索引,这与引用数组List的第一个元素的内容相同。