为什么这个for循环不处理数组的所有元素?

时间:2012-07-09 19:22:11

标签: arrays bash for-loop

给出以下脚本:

#!/bin/bash

asteriskFiles=("sip.conf" "extensions.conf")

for asteriskFile in $asteriskFiles
do
    # backup current configuration file
    cp somepath/${asteriskFile} test/
    echo "test"
done

这只给我输出“test”一次,所以循环只运行一次而不是两次(asteriskFiles数组中的两个条目)。我究竟做错了什么?谢谢你的提示!

3 个答案:

答案 0 :(得分:11)

插图:

$ asteriskFiles=("sip.conf" "extensions.conf")
$ echo $asteriskFiles # is equivalent to echo ${asteriskFiles[0]}
sip.conf
$ echo "${asteriskFiles[@]}"
sip.conf extensions.conf

请注意,引号很重要。 echo ${asteriskFiles[@]}似乎可以正常工作,但如果你的任何文件中有空格,bash会在空格上拼写。

答案 1 :(得分:2)

像这样编写循环的开头

for asteriskFile in "${asteriskFiles[@]}"

答案 2 :(得分:2)

The Probem

asteriskFiles 变量包含一个数组。如果你像标量一样取消引用它,你只能得到数组的第一个元素。

解决方案

您希望使用正确的shell parameter expansion来访问所有下标元素。例如:

$ echo "${asteriskFiles[@]}"
sip.conf extensions.conf

@ subscript(正确引用时)将扩展为数组中正确标记的元素,然后你的for循环将能够迭代。