bash脚本子模块foreach不工作

时间:2016-08-03 18:40:49

标签: git bash

我有以下bash脚本

IGNORE=("test" "jaja");
git submodule foreach --recursive "if [[ \"${IGNORE[@]}\" =~ \"$name\" ]] ; then echo \"skipped\"; else npm install; fi"

由于某种原因,[[ \"${IGNORE[@]}\" =~ \"$name\" ]]不起作用。当我把IGNORE数组放在foreach中时,它可以工作。有谁知道为什么?

这有效:

git submodule foreach --recursive 'IGNORE=("test" "jaja"); if [[ "${IGNORE[@]}" =~ "$name" ]] ; then echo "skipped"; else npm install; fi'

2 个答案:

答案 0 :(得分:0)

试试这个:

git submodule foreach --recursive "[[ ! \"${IGNORE[@]}\" =~ $name ]] && npm install"

如果数组没有表现(bash的if[[并且空格的播放与子节点和老虎一样好,那么尝试递归匹配数组的每个成员,这很好地避免了许多引用也是如此,以及数组扩展的奇怪行为:

git submodule foreach --recursive "for i in ${IGNORE[@]}; do [[ ! $i =~ $name ]] && npm install; done"

答案 1 :(得分:0)

您的数组扩展会生成两个单独的单词:

$ IGNORE=("test" "jaja")
$ printf "%s\n" "if [[ \"${IGNORE[@]}\" =~ \"$name\" ]] ; then echo \"skipped\"; else npm install; fi"
if [[ "test
jaja" =~ "" ]] ; then echo "skipped"; else npm install; fi

作为较大字符串的一部分进行@扩展通常不会达到您的预期。

切换到*会产生相同的结果,但是不清楚为什么要使用数组而不是简单的参数。

$ printf "%s\n" "if [[ \"${IGNORE[*]}\" =~ \"$name\" ]] ; then echo \"skipped\"; else npm install; fi"
if [[ "test jaja" =~ "" ]] ; then echo "skipped"; else npm install; fi