2016-08-03 9 views
0

を働いていない私は[[ \"${IGNORE[@]}\" =~ \"$name\" ]]が動作しないいくつかの理由について、次のbashスクリプトbashスクリプトのサブモジュールのforeachは

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

を持っています。 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" 
:うまくあまりに引用符の多く、ならびにアレイ拡張の奇妙な挙動を回避するアレイの各メンバーのマッチング通常、あなたが期待しないだろう長い文字列の一部として

$ 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 

@拡張:

+0

仕事は動作しませんしません – Jasmine

0

お使いのアレイの拡張は、2つの別々の単語を生成します。 *への切り替え

は、同じ結果を生成する必要がありますが、あなたは、配列の代わりに、簡単なパラメータを使用している理由、それは明らかではありません。

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