使用 jq 检查 package.json 中是否存在 "builds" 部分
Check for presence of "builds" section in package.json using jq
我需要编写一个 shell 脚本来检查 NPM 项目的 package.json
文件中是否存在构建密钥。为此,我使用了 jq
的 has
函数;但得到误报。如果不熟悉 package.json
,我打算在 JSON 文件中查找是否存在密钥,但密钥本身就是一个 JSON 对象(我的意思是嵌套)。
下面是使用的脚本。
if [ $(./jq 'has(".scripts.build")' package.json) == "true" ];
then
echo "Has a build section"
else
echo "No build section"
fi
此脚本始终命中代码的 else
部分。你能指出哪里出了问题吗?
最好将退出代码与 -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
假设 package.json 包含一个 JSON 对象,可以使用过滤器:
.scripts.build
不过,为了健壮性,建议使用:.scripts.build?
例如,如果你想找到 pwd 下所有丢失的 package.json 文件。scripts.build,你可以使用@JeffMercado 建议的策略:
find . -name package.json | while read f
do
jq -e '.scripts.build?' "$f" > /dev/null || echo "$f"
done
或者您可以完全跳过 shell 测试,例如这是刚刚提到的任务的更好解决方案:
find . -name package.json | while read f
do
jq -r 'select(.scripts.build? | not)
| input_filename' "$f"
done
我需要编写一个 shell 脚本来检查 NPM 项目的 package.json
文件中是否存在构建密钥。为此,我使用了 jq
的 has
函数;但得到误报。如果不熟悉 package.json
,我打算在 JSON 文件中查找是否存在密钥,但密钥本身就是一个 JSON 对象(我的意思是嵌套)。
下面是使用的脚本。
if [ $(./jq 'has(".scripts.build")' package.json) == "true" ];
then
echo "Has a build section"
else
echo "No build section"
fi
此脚本始终命中代码的 else
部分。你能指出哪里出了问题吗?
最好将退出代码与 -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
假设 package.json 包含一个 JSON 对象,可以使用过滤器:
.scripts.build
不过,为了健壮性,建议使用:.scripts.build?
例如,如果你想找到 pwd 下所有丢失的 package.json 文件。scripts.build,你可以使用@JeffMercado 建议的策略:
find . -name package.json | while read f
do
jq -e '.scripts.build?' "$f" > /dev/null || echo "$f"
done
或者您可以完全跳过 shell 测试,例如这是刚刚提到的任务的更好解决方案:
find . -name package.json | while read f
do
jq -r 'select(.scripts.build? | not)
| input_filename' "$f"
done