
我想創建一個帶有查詢的 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"
(在結尾)。