2017-08-28 30 views
1

我是bash的新手,我正在編寫一個shell腳本,通過package.json(jq)中列出的依賴關係,查看它使用了多少次(ack),如果它少於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 

您可以看到I ack兩次。我怎樣才能ack一次?我嘗試將輸出設置爲一個變量,但它不工作,我想要它。從john1024的回答

輸出:

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/')' 

提供的解決方案(現在加入do

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中,然後使用s無論輸出ack是否需要。

+0

不要在'wc'的調用中加雙引號。它用前導空格輸出輸出,所以你需要忽略它們。 – Barmar

+0

@Barmar有趣的觀察。我只是對它進行了測試,並沒有看到領先空間的不良影響。您是否瞭解領先空間混淆bash算術比較的情況? – John1024

+0

得到這個:第4行:語法錯誤附近的意外令牌s = $(ack「$ i」--ignore-dir = dist --ignore-file ='match:/package.json/')' – swagrov