使用重写标记(`)使用bash脚本运行MySQL命令

时间:2017-10-23 16:51:47

标签: mysql bash

我想使用bash脚本运行mysql命令,但由于重音符号(`)而出现语法错误。

mysql -u root -p -e "GRANT ALL PRIVILEGES ON `testuser\_%` . * TO 'testuser'@'%';"

Let MySQL users create databases, but allow access to only their own databases

bash: testuser_%: command not found... Enter password: ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '* TO 'testuser'@'%'' at line 1

看起来bash会混淆这部分`testuser\_%` 有什么建议吗?

3 个答案:

答案 0 :(得分:0)

在shell世界中,如果你遇到分隔符问题,请添加更多反斜杠:

"GRANT ALL PRIVILEGES ON \`testuser\_%\` .  * TO 'testuser'@'%';"

这应解决问题。

未转义的`字符表示"execute this command and inline the result"

答案 1 :(得分:0)

逃避反引号,它们用于双引号中的命令替换。

Window {
    id: window
    width: 640
    height: 480
    visible: true


    Flickable{
        id:flick
        width : parent.width
        height : 300
        contentHeight: chartview.height
        contentWidth:  chartview.width
        ChartView {
            id: chartview
            width: window.width * 2
            height: 300

            LineSeries {
                name: "LineSeries"
                axisX: ValueAxis {
                    min: 0
                    //max: 200
                    tickCount: 12
                    labelFormat: "%.0f"
                }
                XYPoint { x: 0; y: 0.0 }
                XYPoint { x: 1.1; y: 3.2 }
                XYPoint { x: 1.9; y: 2.4 }
                XYPoint { x: 2.1; y: 2.1 }
                XYPoint { x: 2.9; y: 2.6 }
                XYPoint { x: 3.4; y: 2.3 }
                XYPoint { x: 200.1; y: 3.1 }
            }
        }

        ScrollBar.horizontal: ScrollBar {
            id: hbar
            hoverEnabled: true
            active: hovered || pressed
            orientation: Qt.Horizontal
        }
    }
}

您也可以将MySQL命令放在单引号中,然后不进行替换。您需要将嵌入的引号切换为双引号:

mysql -u root -p -e "GRANT ALL PRIVILEGES ON \`testuser\_%\` .  * TO 'testuser'@'%';"

答案 2 :(得分:0)

正如其他人已经回答的那样,反向滴答是对shell的命令替换元字符 - 但只有在将它们放在双引号字符串中时才会出现这种情况。

所以最简单的解决方案是将它们放在单引号字符串中:

mysql -u root -p -e 'GRANT ALL PRIVILEGES ON `testuser\_%` .  * TO testuser@%;'

请注意,我省略了user @ host周围的引号。在这种情况下,你不需要它们。 https://dev.mysql.com/doc/refman/5.7/en/account-names.html说:

  

如果用户名和主机名是合法的,则不需要引用它们作为不带引号的标识符。指定包含特殊字符(例如空格或 - )的user_name字符串或包含特殊字符或通配符(例如。或%)的host_name字符串是必需的;例如,' test-user' @'%。com'。

     

使用反引号(`),单引号(')或双引号(")引用用户名和主机名作为标识符或字符串。