2017-06-05 201 views
-3

下面的代碼不會執行我需要的操作。我想將$ STR傳遞給Underscore,並從JSON數據中提取出「name」屬性。使用Linux bash shell和Underscore解析JSON

#!/bin/bash 
STR='['[email protected]']'; 
RESULT=`underscore pluck --data '+$STR+' name`; 
echo $RESULT; 

JSON數據:

{"maxResults":1,"resultList":[{"@class":"com.sohnar.trafficlite.transfer.crm.refactor.ClientCRMEntryTO","id":331458,"version":2,"dateCreated":"2017-05-31T13:20:22.960+0000","dateModified":"2017-06-05T14:23:59.961+0000","lastUpdatedUserId":71954,"name":"ACME_CLIENT","website":null,"description":null,"billingLocation":null,"primaryLocation":null,"crmEntryType":"CLIENT","industryType":null,"accountManagerId":103049,"crmClientClassificationListItemId":{"id":12405},"companyProfile":{"id":486024,"version":1,"dateCreated":"2017-05-31T13:20:22.960+0000","dateModified":"2017-06-05T14:23:59.962+0000","sourceOfBusinessListItemId":null,"creditTermsListItemId":{"id":4215},"relationshipSince":"2017-05-30T23:00:00.000+0000","turnover":0,"employees":0,"taxNumber":null,"companyNumber":null,"nominalCode":null,"accountPackageId":null,"optOutMarketing":false,"optOutEmail":false,"optOutTelephone":false,"notes":null},"colorCode":0,"externalCode":"SAP-01","clientState":"CLIENT","defaultCustomRateSetId":null,"preferredCurrencyId":{"id":48},"freeTags":[]}],"windowSize":5,"currentPage":1} 
+1

'$ STR'不是單引號內的擴張。用''+ $ STR +'替換''+ $ STR +''' – janos

+0

當我這樣做時出現以下錯誤: 「模式'lax'中解析'--data'參數時出錯:無效或意外的標記」 。 – Berni

+1

您是否可以編輯帖子幷包含您運行的命令,實際結果和預期結果? –

回答

2

這裏的幾個問題。首先你應該使用雙引號,而不是單引號。雙引號允許擴展變量。其次,我假設你不希望+作爲數據的一部分 - 它們不是bash中的字符串連接運算符(不需要一個)。

str="[[email protected]]" 
result=$(underscore pluck --data "$str" name) 
echo $result 

我使用了$()表示法而不是back-ticks(``)。反標記被認爲已被棄用且難以閱讀。

我用小寫替換了大寫的變量名。這是因爲shell使用了許多大寫的變量名,所以使用大寫會冒名稱衝突。最好使用較低或混合大小寫的變量名稱。

我也刪除了多餘的分號;。他們沒有造成任何傷害,但他們也沒用。在bash中,分號是語句分隔符,而在像C和Java這樣的語言中,它們是語句終結符。

編輯:雙引號[email protected]

+0

從「$ str」更改爲「」$ str「'之前和之後添加單引號,我會得到以下結果。現在的結果是:[null,null,null,null] – Berni

+0

將數據的單引號部分傳遞給'underscore'?你傳遞給'$ @'的是什麼?你期望什麼價值?什麼是'下劃線'? – cdarke

+0

我得到[null,null,null,null]的原因是因爲它將我的輸入視爲字符串文字。 – Berni

0

我想通了......

#!/bin/bash 
name=$(underscore select .name --outfmt text < get.crm.client.acme.json) 
echo $name 
+1

那麼在你的問題中用'$ @'代表什麼?如果你告訴我們'下劃線'程序從標準輸入讀取JSON,我們可以節省很多時間。 – cdarke

+0

我更改了代碼以使其正常工作。道歉。 – Berni