我有以下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'
答案 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