我在脚本中有这段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限制吗?还有其他方法可以建议我这样做吗?
谢谢!
答案 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