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 将它们合并为一个参数。

因此,您需要"在用双引号 ( ) 分隔的字符串内进行转义"。即

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

相关内容