for循环中的bash数组替换被破坏了

时间:2014-08-17 15:56:43

标签: arrays bash for-loop substitution

我在脚本中有这段bash代码:

[..]
ARRAY=("foo-2" "foo-3" "foo-4")
IGNORE=2
while sleep 2
do
       for ii in "${ARRAY[@]/foo-${IGNORE}/}"
       do
              echo $ii
       done
       [..]
done

这段代码本身就有效。但在我的完整脚本中发生了一件奇怪的事情:

第一次睡眠循环运行良好。但是,第二次迭代使用${ARRAY[@]/foo-${IGNORE}/}作为文字字符串。在echo循环中创建单个for命令。

调试for循环:

使用:

  for module in ${ARRAY[@]}

也有效:

  for module in $(echo ${ARRAY[@]} | xargs -n 1 | grep -v foo-${IGNORE})

您认为可能是什么问题?这是某种bash限制吗?还有其他方法可以建议我这样做吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

"${ARRAY[@]/foo-${IGNORE}/}"应扩展为多个元素,但其中一个元素只是一个空字符串而不会被完全忽略。

见:

# A=(1 2 3)
# printf '|%s|\n' "${A[@]//1/}"
||
|2|
|3|

听起来你的阵列根本没有扩展。可能原因是你的shell没有被Bash运行。

无论如何最好只是比较你的元素:

   for ii in "${ARRAY[@]}"
   do
          [[ $ii == "foo-$IGNORE" ]] && continue
          echo $ii
   done

你也可以使用globbing:

   for ii in "${ARRAY[@]}"
   do
          [[ $ii == *"foo-$IGNORE"* ]] && continue
          echo $ii
   done