我是bash的新手,我正在编写一个shell脚本,该脚本遍历package.json(jq
)中列出的依赖项,查看它使用了多少次(ack
),如果回声不到2次。
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的回答:
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
答案 0 :(得分: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的地方使用s
。