Bash
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"]
如何解決?
當你用雙引號 (
"
) 開始一個帶引號的字元串時,帶引號的字元串在第一個非轉義的"
被找到時結束。換句話說,在去掉引號之後,論點-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 將它們組合成一個參數。
因此,您需要
"
在由雙引號 ( ) 分隔的字元串中進行轉義"
。IEmysql -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"
(結尾)。