使用jq检查package.json中是否存在“内部版本”部分

时间:2019-06-28 03:33:22

标签: json npm jq npm-scripts

我需要编写一个Shell脚本来检查NPM项目的package.json文件中是否存在build键。为此,我使用了has的{​​{1}}函数;但得到误报。如果不熟悉jq,我的目的是在JSON文件中查找密钥的存在,但是密钥本身就是一个JSON对象(我是嵌套的)。

下面是使用的脚本。

package.json

此脚本始终会命中代码的if [ $(./jq 'has(".scripts.build")' package.json) == "true" ]; then echo "Has a build section" else echo "No build section" fi 部分。您能指出哪里出了问题吗?

2 个答案:

答案 0 :(得分:2)

对于此类条件,最好将退出代码与-e开关一起使用。此外,您正在尝试检查对象中是否存在键,并且键可能没有".scripts.build"属性。它不会像您正在思考的那样检查该路径。如果要使用has/1,请先向下钻取对象。

if ./jq -e '.scripts | has("build")' package.json > /dev/null; then
    echo "Has a build section"
else
    echo "No build section"
fi

答案 1 :(得分:1)

假设package.json包含一个JSON对象,则可以使用过滤器:

.scripts.build

不过,出于鲁棒性考虑,建议您使用:.scripts.build?

例如,如果您想查找pwd下所有缺少.scripts.build的package.json文件,则可以采用@JeffMercado建议的策略:

find . -name package.json | while read f
do
  jq -e '.scripts.build?' "$f" > /dev/null || echo "$f"
done

或者您可以完全跳过外壳测试,例如这是刚才提到的任务的更好解决方案:

find . -name package.json | while read f
do
  jq -r 'select(.scripts.build? | not)
         | input_filename' "$f"
done