Bash

Bash 腳本/Mysql 查詢

  • September 26, 2016

我想創建一個帶有查詢的 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"]

如何解決?

當你用雙引號 ( ") 開始一個帶引號的字元串時,帶引號的字元串在第一個非轉義的"被找到時結束。換句話說,在去掉引號之後,論點-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

但由於引號內沒有空格,shell 將它們組合成一個參數。

因此,您需要"在由雙引號 ( ) 分隔的字元串中進行轉義"。IE

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

耶!有用。當您轉義(\在字元前添加 a)雙引號時,它們將成為參數的一部分。

現在舉一個如何出錯的例子:

$ 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"(結尾)。

引用自:https://unix.stackexchange.com/questions/312304