如何删除对“ack”的重复调用

时间:2017-08-28 23:19:44

标签: bash

我是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

1 个答案:

答案 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