我的JSON:
{
"projects": {
"api-client": {
"status": "false",
"when": "19-01-2016 12:54:47"
},
"api-admin": {
"status": "false",
"when": "19-01-2016 12:54:47"
},
"myweb": {
"status": "false",
"when": "19-01-2016 12:54:47"
}
}
}
脚本:
JQ=$(which jq)
CACHE='cache.json'
PROJECT=("api-client" "api-admin" "myweb")
for PROJECT in ${PROJECTS[*]}; do
if [[ $(${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}) != null ]]; then
if [[ $(${JQ} -r ".projects.\"${PROJECT}\".status" ${CACHE}) == true ]]; then
local PROJECTDATE=$(${JQ} -r ".projects.\"${PROJECT}\".when" ${CACHE})
local STATUS="${COLOR_GREEN}Installed${CLEAR} on ${COLOR_YELLOW}${PROJECTDATE}${CLEAR}"
else
local STATUS="${COLOR_RED}Not installed${CLEAR}"
fi
echo -e "${CLEAR} - ${COLOR_CYAN}${PROJECT}${CLEAR} => ${STATUS}"
fi
done
错误:错误:语法错误,意外的QQSTRING_START,期待IDENT .projects。 “API客户端” ^ 1编译错误错误:语法错误,意外的QQSTRING_START,期待IDENT .projects。“api-client”.status ^ 1编译错误 - api-client =>未安装
有人可以帮我调试我的脚本吗?
答案 0 :(得分:4)
首先,.foo.bar
只是.["foo"]["bar"]
的简写语法。将后者用于非字母数字值,例如api-client
。
其次,你不应该通过将shell变量插入到它们中来编写jq脚本。相反,使用--arg将值传递给它们。也就是说,而不是这样做:
${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}
你可能应该这样做:
${JQ} --arg project "$PROJECT" -r '.projects[$project]' ${CACHE}
注意jq程序的单引号:$project
是jq变量的语法,就像在Perl或PHP中一样;它不是由shell插值的。始终在jq程序周围使用单引号。
第三,您可以使用-e
,以便在truthy值上的状态代码为0。而不是:
if [[ $(${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}) != null ]]; then
你可以这样做:
if ${JQ} --arg project "$PROJECT" -e -r '.projects[$project]' ${CACHE}; then
同样,您可以以相同的方式将比较删除为true。