Bash
bash 字元串連接失敗
重要提示:我正在使用Cygwin執行此腳本。
我通過執行得到了一個 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" }
然後我想把這個字元串包裝在裡面
{"docs":[]}
,這樣我以前的 JSON 就會被注入到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
我在這裡看不到任何“異常”字元。
我認為 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:]]'
which 查找任何“非列印”字元(即不可見的東西,如控製字元)。如果 grep 返回任何可以確認的內容,那麼有多種方法可以定位和修復有問題的字元。例如,您可以使用與sed相同的正則表達式。或者使用十六進制編輯器(甚至 vim/xxd)。如果它是 CR,那麼 OP 使用的相同 sed 命令應該執行以下操作:sed 's/\r//g'