Bash 스크립트/Mysql 쿼리

Bash 스크립트/Mysql 쿼리

쿼리를 사용하여 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"(끝에)입니다.

관련 정보