2017-11-11 70 views
1

的package.json文件的读取name属性我有这样的:使用bash

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'" 

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

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

注意反引号:

回答

1

,因为你正在试图解析字符串

"[object Object]" 

你应该改变你的bash脚本有你得到一个JSON解析错误!你的字符串是一个多行字符串。

这里有一个运行(在我的项目目录之一):

$ 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 

附录2

你甚至可以离开关console.log如果你使用-p

$ prop="name" 
$ my_val="$(node -pe "require('./package.json')['$prop']")" 
$ echo $my_val 
plainscript 
+0

感谢让我试试吧,长相值得的。我更新了这个问题 - 您知道为防止'undefined'始终从'node -e'记录的任何方式吗?标准输出包括'未定义'在最后,我认为有一种方法可以防止这种情况,但我忘记了。 –

+0

是的,删除'-p' –

+0

好酷,我忘记了'-p' arg是什么,你也可以使用'||'显然是这样的:'my_val =“$(node -pe”console.log (require('./ package.json')['$ prop'])||''“)”' –

4

在Linux系统中有命令JQ可以解析JSON文件

jq -r ".name" package.json 
+0

非常酷!如果你在Mac上:'brew install jq'可以得到你的程序。 –

+0

'brew install jq'可以在MacOS *上获得该程序*,而不是* nix ...'jq'是否包含Bash v4? –

+1

@AlexanderMills它完全独立于'bash'(就像'grep','awk','sed','node'等等),但是如果你想从命令行使用JSON, *建议您安装它。您的发行版可能会将其包含在其存储库中,但手动安装非常简单;它是一个静态链接的二进制文件。请参阅https://stedolan.github.io/jq/download/ – chepner