2016-08-03 143 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