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

但由於引號內沒有空格,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

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

現在舉一個例子來說明這種情況是如何出錯的:

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

相關內容