2016-09-06 36 views
3

我怎樣才能檢索以下JSON文件version屬性,並在bash腳本使用它..如何檢索BASH中的JSON值(git commit中的自動版本)?

文件的package.json

{ 
    "name": "myapp", 
    "version": "0.0.1" 
} 

所需的腳本:bpush.sh

#!/bin/bash 
gulp bump 
git add -A 
eval $pkg_ver = getjson('./package.json', 'version') 
git commit -a -m "$pkg_ver" 
git push origin master 

顯然,getjson()函數無效。這就是我想弄明白的。

編輯:最終結果
這裏是我以前,由於下面的人......

#!/bin/sh 

pkg_ver=$(jq '.version' package.json) 
pkg_ver=${pkg_ver//\"/} 
git add -A 
git commit -a -m $pkg_ver 
git push origin master 
+0

'pkg_ver = $(TR -cd '[0-9。]'<的package.json)'? – Cyrus

+0

這裏不需要'eval';只需使用'pkg_ver = $(...)',其中'...'將由可接受的答案提供。 – chepner

回答

6

如果你的JSON文件是比較複雜的話,我會建議使用JQ - link

pkg_ver=$(jq '.version' package.json) 

但是,如果你只有這兩個項目,那麼也許使用sed,awk或tr會更容易。

+1

也許'$ pkg_ver = $(jq'.version'

+0

@ DavidC.Rankin是的,我忘記了這個文件。 –

+0

會發生,我們可以告訴你想要做什麼。做好'jq'建議。 –

2

爲什麼不使用本身從here-doc? :)

記住,JS代表JavaScript對象符號

pkg_ver=$(
    node<<EOF 
    var obj = $(<package.json); 
    console.log(obj.version); 
EOF 
) 

通過更換nodenodejs可執行文件或如果你沒有node

或者作爲一行代碼就

node <<< "var obj = $(<package.json); console.log(obj.version);" 
+0

也許你想'var obj = $(

+0

順便說一下,'console.log'去標準輸出或標準錯誤?如果是後者,則需要重新定向以確保捕獲它。爲了達到示範目的,將整個事件換成命令替換是不會傷害的。 –

+0

你對'$(

1

可以使用也蟒蛇單行

pkg_ver=$(
    python -c 'import sys,json; print(json.load(sys.stdin)["version"])' \ 
    < package.json 
) 

甚至

pkg_ver=$(
    python -c 'import sys,json;print(json.load(open("package.json"))["version"])' 
) 
+0

更好地取出'cat'並使用'

+0

@CharlesDuffy是的,你是對的!謝謝:)我會編輯我的回答 – vsminkov

+0

hmm,我也不確定''json.loads(open(「foo」))'工作,因爲'loads()'是加載一個* string *。你的意思是'json.load(open(...))'? –