2017-08-28 9 views
1

私はbashを使い慣れていません。package.json(jq)に列挙されている依存関係を調べるシェルスクリプトを書いています。それが2倍未満の場合は、それをエコーし​​ます。この繰り返しの呼び出しを `ack`に削除するには

arr=($(jq -r '.dependencies | keys | .[]' package.json)) 

for i in "${arr[@]}" 
do 
    n=$(ack $i --ignore-dir=dist --ignore-file='match:/checkDependencies.sh|package.json/' | wc -l) 
    if [[ $n -le 2 ]]; then 
     echo "Package $i has too few occurences" 
     ack $i --ignore-dir=dist --ignore-file='match:/checkDependencies.sh|package.json/' 
     echo 
    fi 
done 

あなたは、私が二回ackことがわかります。どうすればackを一度だけ入手できますか?私は変数に出力を設定しようとしましたが、それは私がそれをしたいどのように動作していません。

john1024の回答からの出力:

(今追加 do付き)ソリューションを提供
bash -x checkDependencies.sh 
+ arr=($(jq -r '.devDependencies | keys | .[]' package.json)) 
++ jq -r '.devDependencies | keys | .[]' package.json 
checkDependencies.sh: line 4: syntax error near unexpected token `s=$(ack "$i" --ignore-dir=dist --ignore-file='match:/package.json/')' 
checkDependencies.sh: line 4: ` s=$(ack "$i" --ignore-dir=dist --ignore-file='match:/package.json/')' 

arr=($(jq -r '.devDependencies | keys | .[]' package.json)) 

for i in "${arr[@]}" 
    do 
    s=$(ack "$i" --ignore-dir=dist --ignore-file='match:/package.json/') 
    if [ "$(wc -l <<<"$s")" -le 2 ]; then 
     echo "Package $i has too few occurences" 
     echo "$s" 
    fi 
done 

答えて

1

しようと、一回だけACKを使用するには、次のために、

ここ
arr=($(jq -r '.dependencies | keys | .[]' package.json)) 

for i in "${arr[@]}" 
do 
    s=$(ack "$i" --ignore-dir=dist --ignore-file='match:/checkDependencies.sh|package.json/') 
    if [ "$(wc -l <<<"$s")" -le 2 ]; then 
     echo "Package $i has too few occurences" 
     echo "$s" 
    fi 
done 

を各パッケージでは、ackの出力を変数sに格納してからを使用しますは、ackの出力が必要な場所であればどこでも使用できます。

+0

'wc'の呼び出しの前後に二重引用符を入れないでください。それは先行スペースで出力を出力するので、無視する必要があります。 – Barmar

+0

@Barmar興味深い観察。私はちょうどそれをテストし、私は先頭のスペースの悪影響を参照してください。あなたは先導スペースがbashの算術比較を混乱させる状況を知っていますか? – John1024

+0

これを得る:行4:予期しないトークン 's = $(ack" $ i "--ignore-dir = dist --ignore-file = '一致:/package.json/') 'の近くの構文エラー – swagrov

関連する問題