DEV Community

Bach Huynh V. VN.Danang
Bach Huynh V. VN.Danang

Posted on

Lưu ý khi sử dụng echo khi biến có JSON format

Ví dụ tôi đang có biến sau lấy kết quả response của một API:

projects=$(curl --insecure -s -X GET "$octopusURL/api/projects/all" -H "accept: application/json" -H "$header") 
Enter fullscreen mode Exit fullscreen mode

Response có dạng sau:

[ { "Id": "string", "VariableSetId": "string", "DeploymentProcessId": "string", "DiscreteChannelRelease": true, "IncludedLibraryVariableSetIds": [ "string" ], "DefaultToSkipIfAlreadyInstalled": true, "TenantedDeploymentMode": "Untenanted", "DefaultGuidedFailureMode": "EnvironmentDefault", "VersioningStrategy": { "DonorPackageStepId": "string", "Template": "string" }, "ReleaseCreationStrategy": { "ReleaseCreationPackageStepId": "string", "ChannelId": "string" }, "Templates": [ { "Id": "string", "Name": "string", "Label": "string", "HelpText": "string", "DefaultValue": { "IsSensitive": true, "Value": "string", "SensitiveValue": { "HasValue": true, "NewValue": "string" } }, "DisplaySettings": { "additionalProp1": "string", "additionalProp2": "string", "additionalProp3": "string" } } ], "AutoDeployReleaseOverrides": [ { "EnvironmentId": "string", "TenantId": "string", "ReleaseId": "string" } ], "Name": "string", "Slug": "string", "Description": "string", "IsDisabled": true, "ProjectGroupId": "string", "LifecycleId": "string", "AutoCreateRelease": true, "ProjectConnectivityPolicy": { "SkipMachineBehavior": "None", "TargetRoles": [ "string" ], "AllowDeploymentsToNoTargets": true }, "LastModifiedOn": "2024-04-10T02:18:59.115Z", "LastModifiedBy": "string", "Links": { "additionalProp1": "string", "additionalProp2": "string", "additionalProp3": "string" } } ] 
Enter fullscreen mode Exit fullscreen mode

Nếu tôi muốn lấy project ID của một project Name tương ứng, thường sẽ sử dụng như sau:

projectId=$(echo "$projects" | jq --arg projectName "$projectName" -r '.[] | select(.Name == $projectName) | .Id') 
Enter fullscreen mode Exit fullscreen mode

Và sau đó rất nhiều điều rắc rối, lỗi xuất hiện:

parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 268, column 76 
Enter fullscreen mode Exit fullscreen mode

sửa lỗi này thì thêm
tr -d '\000-\037' vào command để loại bỏ việc xuống hàng trong một chuỗi của value

Nhưng lại tiếp tục xảy ra

parse error: Invalid escape at line 1, column 17150 
Enter fullscreen mode Exit fullscreen mode

Khi tìm hiểu thì thấy:
"DefaultValue": "C:\Web\xxxxx\xxxx",
Tức là bị lỗi khi có ký tự \ trong value

Vậy là tiến hành replace ký tự đó v.v...

Nhưng lỗi vẫn cứ tiếp tục...

Nguyên nhân là do lệnh echo đã tự động thay đổi:

  • \n -> new line
  • \\ -> \
  • \" -> "

Để tránh việc này, thay vì dùng echo, ta có thể lưu response thành file .txt và sử dụng lệnh cat

curl --insecure -s -X GET "$octopusURL/api/projects/all" -H "accept: application/json" -H "$header" > /tmp/projects.json projectId=$(cat /tmp/projects.json | jq '.[] | select(.Name=="$projectName") | .Id') echo "The projectId for $projectName is $projectId" rm /tmp/projects.json 
Enter fullscreen mode Exit fullscreen mode

Hoàn toàn không xảy ra lỗi vớ vẫn nào nữa...

Top comments (0)