使用bash读取package.json文件的name属性

时间:2017-11-11 05:36:39

标签: json node.js bash shell zsh

我有这个:

str=`cat package.json`
prop="name"
my_val="$(node -e "console.log(JSON.parse(${str})[${prop}]);")"
echo "$my_val"

我想阅读package.json文件的name属性。我认为这很接近,但我收到了一个JSON.parse错误:

SyntaxError: Unexpected token o in JSON at position 1
    at Object.parse (native)
    at [eval]:1:18
    at ContextifyScript.Script.runInThisContext (vm.js:25:33)
    at Object.runInThisContext (vm.js:97:38)
谁知道如何解决?

这有效:

prop="name"
my_val="$(node -e "console.log(require('./package.json')['$prop'])")"
echo "json val: '$my_val'"

但我想知道如何以第一种方式做到这一点。

2 个答案:

答案 0 :(得分:4)

在linux系统上有命令jq,它可以解析JSON文件

jq -r ".name" package.json

答案 1 :(得分:1)

您收到JSON解析错误,因为您正在尝试解析字符串

"[object Object]"

您应该将bash脚本更改为:

node -e "console.log(JSON.parse(\`$str\`)['name'])"

请注意反引号!你的字符串是一个多行字符串。

这是一个运行(在我的一个项目目录中):

$ str=`cat package.json`
$ prop="name"
$ myval="$(node -e "console.log(JSON.parse(\`$str\`)['$prop'])")"
$ echo $myval
plainscript

<强>附录

为了响应OP希望使用require而不是将文件内容回显为字符串,解决方案如下:

$ prop="name"
$ my_val="$(node -e "console.log(require('./package.json')['$prop'])")"
$ echo $my_val
plainscript

ADDENDUM 2

如果您使用console.log

,您甚至可以取消-p
$ prop="name"
$ my_val="$(node -pe "require('./package.json')['$prop']")"
$ echo $my_val
plainscript