Bash 문자열 연결 실패

Bash 문자열 연결 실패

중요한 팁: 사용 중입니다시빈이 스크립트를 실행하세요.


실행하여 json 문자열을 얻었습니다.

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

내가 얻은 JSON은 다음과 같습니다.

{"_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"}

미화 후:

{
    "_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"
}

그런 다음 이전 JSON이 배열 {"docs":[]}에 삽입되도록 이 문자열을 내부에 래핑하려고 합니다 .docs[]

내가 한 일은 다음과 같습니다.

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

하지만 이것이 내가 얻은 결과입니다

{"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"}

"실패" 부분은 어디에 있습니까? ,"_rev]}"rev"}-> 있어야 할 부분은 어디에 있습니까?,"_rev":"rev"}]}

문자열 연결 중에 어떤 문제가 발생할 수 있나요?


고쳐 쓰다 전체 스크립트는 다음과 같습니다(도움이 되는 경우).

#!/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

업데이트 2 이것은 내 호출 후의 결과입니다 echo "$result" | od -tx1(문자열 연결 후).

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

여기에는 "특이한" 문자가 표시되지 않습니다.

답변1

Steeldriver의 마지막 의견이 정확하다고 생각합니다. 저는 Cygwin을 자주 사용하며, 실수로 캐리지 리턴을 제거하지 않은 텍스트에서 이상한 일이 발생하는 것을 보았습니다.

실험을 해보자. 나는 귀하의 스크립트를 매우 기본적으로 요약했습니다.

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

내 입력은

{"_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"}

올바른 줄 끝으로 실행하십시오.

{"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"}]}

이것이 우리가 기대하는 것입니다.

이제 vim에서 Ctrl-K+Ctrl-M을 사용하여 입력 줄에 캐리지 리턴을 추가하고 다시 실행합니다.

{"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"}

이런. 최종 결과를 살펴보세요 ]}("EVT_IS_CONTROL_CONSULTATION" 직전). 그것들은 당신과 정확히 상쇄되지는 않았지만 의심스러운 유사성입니다.

다른 제어 문자도 비슷한 효과를 일으킬 수 있습니다. 이러한 문자가 있는지 확인하는 간단한 방법은 grep '[^[:print:]]'이를 사용하여 "인쇄되지 않는" 문자(즉, 제어 문자와 같은 보이지 않는 문자)를 찾는 것입니다. grep이 이를 확인하기 위해 무엇이든 반환하는 경우 문제가 되는 문자를 찾아서 수정하는 여러 가지 방법이 있습니다. 동일한 정규식을 사용할 수 있습니다sed예를 들어. 또는 16진수 편집기(vim/xxd도 가능)를 사용하세요. CR인 경우 OP에 사용된 것과 동일한 sed 명령이 다음을 수행해야 합니다.sed 's/\r//g'

관련 정보