我需要编写一个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
部分。您能指出哪里出了问题吗?
答案 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