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
不要在'wc'的調用中加雙引號。它用前導空格輸出輸出,所以你需要忽略它們。 – Barmar
@Barmar有趣的觀察。我只是對它進行了測試,並沒有看到領先空間的不良影響。您是否瞭解領先空間混淆bash算術比較的情況? – John1024
得到這個:第4行:語法錯誤附近的意外令牌s = $(ack「$ i」--ignore-dir = dist --ignore-file ='match:/package.json/')' – swagrov