2017-11-11 89 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