JQ анализирует строки с помощью -

Мой 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-client" ^ 1 ошибка компиляции: синтаксическая ошибка, непредвиденный QQSTRING_START, ожидание IDENT .projects."api-client".status ^ 1 ошибка компиляции - API -клиент => Не установлен

Может кто-нибудь помочь отладить мой скрипт?


person lisi4ok    schedule 19.01.2016    source источник


Ответы (1)


Прежде всего, .foo.bar — это просто сокращенный синтаксис для .["foo"]["bar"]. Используйте последний для небуквенно-цифровых значений, таких как api-client.

Во-вторых, вы никогда не должны составлять jq-скрипты, интерполируя в них переменные оболочки. Вместо этого передайте им значения, используя --arg. То есть вместо этого:

${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}

Вы, вероятно, должны сделать это:

${JQ} --arg project "$PROJECT" -r '.projects[$project]' ${CACHE}

Обратите внимание на одинарные кавычки вокруг программы jq: $project — это синтаксис для переменной jq, как в Perl или PHP; он не интерполируется оболочкой. Всегда используйте одинарные кавычки вокруг ваших программ jq.

В-третьих, вы можете использовать -e, чтобы код состояния был равен 0 для истинных значений. Вместо этого:

if [[ $(${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}) != null ]]; then

Вы можете просто сделать это:

if ${JQ} --arg project "$PROJECT" -e -r '.projects[$project]' ${CACHE}; then

Точно так же вы можете удалить сравнение с истинным таким же образом.

person Community    schedule 19.01.2016