我正在嘗試使用以下方法獲取一些 json 資料jq:
{
"meta": {
"title": "This is a title",
"description": "Just a description"
}
}
通過運行jq -r '.meta | .title, .description' ./project.json,這給了我預期的結果:
This is a title
Just a description
現在我需要將內容分配給我的 bash 腳本中的一個變數:
read TITLE DESCRIPTION < <(echo $(jq -r '.meta | .title, .description' ./project.json))
但由于空間的原因,這不起作用。稍后我必須轉義所有空格,我會這樣做:
echo ${TITLE// /\\ }
我應該如何處理變數的分配(處理空間內容)和轉義空間(也許一步)?
uj5u.com熱心網友回復:
不,你不需要在這里逃避任何事情。
使用 NUL 來分隔所有值,因此我們可以正確支持包含換行符的標題或描述:
{
IFS= read -r -d '' title
IFS= read -r -d '' description
} < <(jq -r '.meta | (.title, .description) | (., "\u0000")' )
如果我們假設title并且description不能包含文字換行符,則以下任何一種都可以:
{
IFS= read -r title
IFS= read -r description
} < <(jq -r '.meta | .title, .description' ./project.json)
...或者,告訴read尋找一個終止的 NUL,從而確保它具有非零退出狀態應該jq失敗(但仍然使用換行符來分隔兩個值):
IFS=$'\n' read -r -d '' title description < <(
jq -r '.meta | (.title, .description, "\u0000")' ./project.json
)
利用 jq 對生成sh兼容的 eval-safe 轉義的支持,我們還可以執行以下操作,它可以正確處理帶有換行符的字串:
eval "$(jq -r '
.meta | "description=\(.description|@sh); title=\(.title|@sh)"
' ./project.json)"
uj5u.com熱心網友回復:
使用 builtinmapfile和bash一個陣列(標題):
mapfile -t title < <(jq -r '.meta | .title, .description' project.json)
echo "${title[0]}"
echo "${title[1]}"
輸出:
這是一個標題 只是描述
uj5u.com熱心網友回復:
使用一些引數替換:
$ x=$(jq ... )
$ title="${x%$'\n'*}"
$ description="${x#*$'\n'}"
$ typeset -p title description
declare -- title="This is a title"
declare -- description="Just a description"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517577.html
標籤:重击jq
