bash 탈출 따옴표

bash 탈출 따옴표

bash 스크립트에서 따옴표를 이스케이프 처리하는 방법이라는 흥미로운 문제에 직면했습니다.

내 bash 스크립트에는 긴 컬 호출이 있으며 큰 -d json 구조가 전달됩니다.

#!/bin/bash

Value4Variable=Value4

curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d  \
'{"Variable1":"Value1", 
"Variable2":"Value2\'s",  # escape of quote doesnt work because of the previous single quote and backslash
"Variable3":"Value3",
"Variable4":"'"$Value4Variable"'", 
"Variable5":"Value5"
}' \
https://www.hashemian.com/tools/form-post-tester.php

json 구조에 작은따옴표를 추가하는 가장 좋은 방법은 무엇입니까? 나는 성공하지 못한 채 다양한 조합을 시도했습니다.

답변1

다른 따옴표를 사용하여 긴 문자열을 이스케이프하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 작은따옴표를 끝내고 작은따옴표를 이스케이프 처리하는 것입니다.

'...'\''...'

하지만 더 나은 일을 할 수 있습니다. Heredocs는 인용 문제를 피할 수 있는 좋은 방법입니다.

curl -s -X POST https://www.hashemian.com/tools/form-post-tester.php \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d  @- <<EOF
{
    "Variable1":"Value1", 
    "Variable2":"Value2's",
    "Variable3":"Value3",
    "Variable4":"$Value4Variable", 
    "Variable5":"Value5"
}
EOF

@-컬에게 표준 입력에서 읽도록 지시하고 <<EOF컬의 표준 입력에 입력될 heredoc을 시작하십시오. Heredoc의 좋은 점은 따옴표를 이스케이프 처리할 필요가 없고 bash 변수를 사용할 수 있다는 것입니다. 이는 따옴표를 이스케이프 처리하는 방법에 대해 걱정할 필요가 없고 전체 내용을 더 읽기 쉽게 만듭니다.

답변2

--data @filename파일에서 데이터를 읽으려면 기호를 사용하겠습니다 .

샘플 json-data-file콘텐츠:

{"Variable1":"Value1", 
"Variable2":"Value2's",
"Variable3":"Value3",
"Variable4":"'$Value4Variable'", 
"Variable5":"Value5"
}

묻다:

Value4Variable="Value4"
curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" \
-d @<(sed "s/\$Value4Variable/$Value4Variable/" json-data-file) \
https://www.hashemian.com/tools/form-post-tester.php/test123

산출:

The POSTed value is:

********************

{"Variable1":"Value1", "Variable2":"Value2's","Variable3":"Value3","Variable4":"'Value4'", "Variable5":"Value5"}

********************

Results saved to: test123
*Note: Results are purged periodically. 1 hr minimum life.

답변3

JSON 문서를 생성하려면 JSON 인식 도구를 사용하는 것이 좋습니다. 이렇게 하면 탭, 줄 바꿈, 큰따옴표 등과 같은 특수 문자를 수동으로 이스케이프 처리할 필요가 없습니다. 작은따옴표는 실제로 문자입니다.아니요JSON에서 이스케이프해야 합니다. 문자열을 올바르게 인식하려면 쉘이 올바른 따옴표를 사용하는지 확인하기만 하면 됩니다.

jo도구여기에서명령줄에서 JSON 문서를 매우 간단하게 만들 수 있도록 설계되었습니다.

somevariable2='line1
line2
line3'

curl -s -X POST \
    -H 'Content-Type: application/json' \
    -H 'Accept: application/json' \
    -d "$( jo \
        variable1="Value1" \
        variable2="$somevariable2" \
        variable3='String with "quotes"' \
        variable4="It's raining!" \
        variable5='\/\/\/\/\/' )" \
    'https://www.hashemian.com/tools/form-post-tester.php'

또는

somevariable2='line1
line2
line3'

jo \
    variable1="Value1" \
    variable2="$somevariable2" \
    variable3='String with "quotes"' \
    variable4="It's raining!" \
    variable5='\/\/\/\/\/' |
curl -s -X POST \
    -H 'Content-Type: application/json' \
    -H 'Accept: application/json' \
    -d @- \
    'https://www.hashemian.com/tools/form-post-tester.php'

모든 코드 조각의 응답은 다음과 같습니다.

The POSTed value is:

********************

{"variable1":"Value1","variable2":"line1\nline2\nline3","variable3":"String with \"quotes\"","variable4":"It's raining!","variable5":"/\\/\\/\\/\\/"}

********************

관련 정보