
쿼리를 사용하여 bash 스크립트를 만들고 싶습니다.
mysql -D $Database -u $User -p$Password \
-e "UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"`
내 결과는 다음과 같습니다.
[TEXT,TEXT,TEXT]
다음을 수행해야 합니다.
["TEXT","TEXT","TEXT"]
어떻게 고치나요?
답변1
큰따옴표( )로 인용된 문자열을 시작하면 "
인용된 문자열은 이스케이프되지 않은 첫 번째 검색에서 끝납니다 "
. 즉, 따옴표를 삭제한 후 인수는 -e
천천히 다음과 같이 됩니다.
"UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"
UPDATE example SET example='[TEXT","TEXT","TEXT"]' WHERE example='example';" # dropped first quotes
UPDATE example SET example='[TEXT,TEXT","TEXT"]' WHERE example='example';" # drop 2nd quotes (",")
UPDATE example SET example='[TEXT,TEXT,TEXT"]' WHERE example='example';" # drop 3rd (",")
UPDATE example SET example='[TEXT,TEXT,TEXT]' WHERE example='example'; # drop last
그러나 따옴표 안에 공백이 없기 때문에 쉘은 이를 하나의 인수로 묶습니다.
"
따라서 큰따옴표( )로 구분된 문자열 내부에서 이스케이프해야 합니다 "
. 즉
mysql -D $Database -u $User -p$Password \
-e "UPDATE example SET example='[\"TEXT\",\"TEXT\",\"TEXT\"]' WHERE example='example';"
추가 예:
$ echo yay
yay
$ echo "yay"
yay
$ echo "yay yay"
yay yay
$ echo "yay 'yay' yay"
yay 'yay' yay
$ echo "yay 'yay yay yay' yay"
yay 'yay yay yay' yay
$ echo "yay 'yay "yay" yay' yay"
yay 'yay yay yay' yay
$ echo "yay 'yay \"yay\" yay' yay"
yay 'yay "yay" yay' yay
이야! 효과가있다. 큰따옴표를 이스케이프( \
문자 앞에 추가)하면 인수의 일부가 됩니다.
이제 이것이 어떻게 잘못될 수 있는지에 대한 예:
$ perl -e 'print "$ARGV[0]\n"' "yay "yay" yay"
yay yay yay
$ perl -e 'print "$ARGV[0]\n"' "yay "yay "yay"
yay yay
마지막 예에서는 인용되지 않은 공백이 있기 때문에 인수가 분할되었습니다. 인용된 것은 "yay "
(처음에)와 "yay"
(끝에)입니다.