bash string falhou

3

Nota importante : estou usando Cygwin para executar este script.

Eu tenho uma string json executando

result=$(jq -c ".docs[$docIndex] + { \"_rev\": \"rev\" }"<<<"$fileContent")

Aqui está o JSON que recebo:

{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}

Após o embelezamento:

{
    "_id": "VT_CONSULTATION",
    "name": "External Consultation",
    "type": "VISIT_TYPE",
    "sections": [
        "HS_SECTION_AMBU"
    ],
    "displayFields": [
        {
            "eventTypeId": "ET_CONSULTATION",
            "elementValueTypeId": "EVT_IS_ACNC"
        },
        {
            "eventTypeId": "ET_CONSULTATION",
            "elementValueTypeId": "EVT_MAIN_DIAGNOSTIC"
        },
        {
            "eventTypeId": "ET_CONSULTATION",
            "elementValueTypeId": "EVT_IS_CONTROL_CONSULTATION",
            "displayTrueValue": "Control visit",
            "displayFalseValue": ""
        }
    ],
    "_rev": "rev"
}

E, em seguida, quero incluir essa string dentro de {"docs":[]} para que meu JSON anterior seja injetado dentro da matriz docs[] .

Aqui está o que eu fiz:

result="{\"docs\":["$result"]}"

Mas aqui está o resultado que recebo

{"docs":[{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev]}"rev"}

Onde a parte "com falha" é ,"_rev]}"rev"} - > deve ser ,"_rev":"rev"}]}

O que poderia ter dado errado durante a concatenação de string?

UPDATE  Aqui está o script completo, se puder ajudar:

#!/bin/bash
for file in "$1"/*; do
    allStatus=$(curl -H "Content-Type: application/json" -H "Cache-Control: no-cache" --data-binary "@$file" $2/$3/_bulk_docs --silent | jq '.[] |.status' | tr -d '\r')
    docIndex=0
    while IFS=' ' read -ra statusArray; do
      for status in "${statusArray[@]}"; do
        if [ "$status" = "409" ]
        then
            sed -i 's/\r//g' $file
            fileContent='cat $file'
            id='jq -r ".docs[$docIndex]._id"<<<"$fileContent" | tr -d '\r''
            rev=$(curl -X GET --header 'Accept: application/json' $2/$3/$id?revs=true --silent | jq -r '._rev' | tr -d '\r')
            result=$(jq -c ".docs[$docIndex] + { \"_rev\": \"rev\" }"<<<"$fileContent")
            result="{\"docs\":[$result]}"
            #Here result is broken
            s=$(curl -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d $result $2/$3/_bulk_docs --silent)
        else
          echo "No Conflict"
        fi
        docIndex=$((docIndex+1))
      done
    done <<< "$allStatus"
done

Atualização 2 Aqui está o que eu tenho depois que eu fiz uma chamada para echo "$result" | od -tx1 (após a concatenação de string)

0000000 7b 22 64 6f 63 73 22 3a 5b 7b 22 5f 69 64 22 3a
0000020 22 56 54 5f 43 4f 4e 53 55 4c 54 41 54 49 4f 4e
0000040 22 2c 22 6e 61 6d 65 22 3a 22 45 78 74 65 72 6e
0000060 61 6c 20 43 6f 6e 73 75 6c 74 61 74 69 6f 6e 22
0000100 2c 22 74 79 70 65 22 3a 22 56 49 53 49 54 5f 54
0000120 59 50 45 22 2c 22 73 65 63 74 69 6f 6e 73 22 3a
0000140 5b 22 48 53 5f 53 45 43 54 49 4f 4e 5f 41 4d 42
0000160 55 22 5d 2c 22 64 69 73 70 6c 61 79 46 69 65 6c
0000200 64 73 22 3a 5b 7b 22 65 76 65 6e 74 54 79 70 65
0000220 49 64 22 3a 22 45 54 5f 43 4f 4e 53 55 4c 54 41
0000240 54 49 4f 4e 22 2c 22 65 6c 65 6d 65 6e 74 56 61
0000260 6c 75 65 54 79 70 65 49 64 22 3a 22 45 56 54 5f
0000300 49 53 5f 41 43 4e 43 22 7d 2c 7b 22 65 76 65 6e
0000320 74 54 79 70 65 49 64 22 3a 22 45 54 5f 43 4f 4e
0000340 53 55 4c 54 41 54 49 4f 4e 22 2c 22 65 6c 65 6d
0000360 65 6e 74 56 61 6c 75 65 54 79 70 65 49 64 22 3a
0000400 22 45 56 54 5f 4d 41 49 4e 5f 44 49 41 47 4e 4f
0000420 53 54 49 43 22 7d 2c 7b 22 65 76 65 6e 74 54 79
0000440 70 65 49 64 22 3a 22 45 54 5f 43 4f 4e 53 55 4c
0000460 54 41 54 49 4f 4e 22 2c 22 65 6c 65 6d 65 6e 74
0000500 56 61 6c 75 65 54 79 70 65 49 64 22 3a 22 45 56
0000520 54 5f 49 53 5f 43 4f 4e 54 52 4f 4c 5f 43 4f 4e
0000540 53 55 4c 54 41 54 49 4f 4e 22 2c 22 64 69 73 70
0000560 6c 61 79 54 72 75 65 56 61 6c 75 65 22 3a 22 43
0000600 6f 6e 74 72 6f 6c 20 76 69 73 69 74 22 2c 22 64
0000620 69 73 70 6c 61 79 46 61 6c 73 65 56 61 6c 75 65
0000640 22 3a 22 22 7d 5d 2c 22 5f 72 65 76 22 3a 22 72
0000660 65 76 22 7d 0d 5d 7d 0a
0000670

Eu não vejo nenhum caractere "anormal" aqui.

    
por MHogge 16.06.2017 / 15:38

1 resposta

1

Eu acho que a steeldriver está no caminho certo com seu último comentário. Eu sou um usuário freqüente do Cygwin e vi coisas estranhas acontecerem com o texto que eu, por engano, não tirei de retornos de carro.

Vamos tentar um experimento. Eu tenho uma destilação básica do seu script:

result="$(cat $1)"
result="{\"docs\":[$result]}"
echo $result

Minha entrada é

{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}

Correndo com finais de linha adequados:

{"docs":[{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}]}

É o que esperamos.

Agora eu adiciono um retorno de carro à linha de entrada (usando Ctrl-K + Ctrl-M no vim) e corro de novo:

{"docs":[{"_id":"VT_CONSULTATION","name":"External Consultation","type":"VISIT_TYPE","sections":["HS_SECTION_AMBU"],"displayFields":[{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_IS_ACNC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeId":"EVT_MAIN_DIAGNOSTIC"},{"eventTypeId":"ET_CONSULTATION","elementValueTypeI]}:"EVT_IS_CONTROL_CONSULTATION","displayTrueValue":"Control visit","displayFalseValue":""}],"_rev":"rev"}

Opa. Veja onde o% final ]} acabou (logo antes de "EVT_IS_CONTROL_CONSULTATION"). Eles não são compensados da mesma maneira que o seu, mas essa é uma semelhança suspeita.

Efeitos semelhantes podem ser causados por outros caracteres de controle. Uma maneira simples de verificar se tais caracteres existem é usar grep '[^[:print:]]' , que procura por caracteres "não imprimíveis" (ou seja, itens invisíveis, como caracteres de controle). Se o grep retorna qualquer coisa que confirme em que ponto existem várias maneiras de localizar e corrigir o (s) caractere (s) ofensivo (s). Você pode usar o mesmo regex com sed por exemplo. Ou use um editor hexadecimal (ou mesmo vim / xxd). Se for um CR, o mesmo comando sed usado pelo OP deve ser: sed 's/\r//g'

    
por 17.06.2017 / 15:36