2016-08-03 139 views
0

我有以下bash脚本bash脚本子模块的foreach不工作

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' 

回答

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" 
+0

不起作用不起作用 – Jasmine

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