5

给定以下脚本:

#!/bin/bash

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

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

这给了我一次输出“测试”,所以循环只运行一次而不是两次(星号文件数组中的两个条目)。我究竟做错了什么?感谢您的任何提示!

4

3 回答 3

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 会在空格上进行单词拆分。

于 2012-07-09T19:24:08.783 回答
2

像这样写循环的开头

for asteriskFile in "${asteriskFiles[@]}"
于 2012-07-09T19:31:51.730 回答
2

问题

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

解决方案

您想使用正确的shell 参数扩展来访问所有下标元素。例如:

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

@ 下标(正确引用时)将扩展为数组中正确标记的元素,然后您的 for 循环将能够对其进行迭代。

于 2012-07-09T19:31:54.163 回答