命令行自变量受系统命令外壳的解释,在传递给调用程序之前,请更改命令的行为或更改自变量的值。
当参数(例如的值--password
)包含外壳程序可能会解释的字符时,则需要将其加引号(通常'
在UNIX "
中用单引号括起来,或在Windows中用双引号括起来)或单独进行转义(通常\
在每个元字符前加反斜杠)),以避免被shell解释。
尽管特定字符是系统特定的,但需要注意的一些字符包括:
$ & ! \ [ ] < > `
如果密码(对于一个非常糟糕的例子)设置为pa$$word
...
mysql --password=pa$$word # does not work
mysql --password='pa$$word' # works
mysql --password=pa\$\$word # works, but slightly unclear what's going on at first glance
进一步阅读:
更新:要对密码中的'
单"
引号或双引号进行转义,可以用引号反斜杠将其转义,或者如果没有其他字符与所选引号风格不兼容,则可以将整个参数用相反的引号引起来用。
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
如果您还使用单引号和其他特殊字符,则您将不得不使用反斜杠转义,因为在UNIX中,双引号比单引号“更弱”,并且许多元字符在用双引号引起来时仍会扩展,但不是单引号引号。
这不是特定于MySQL的,但适用于带有命令行参数的任何内容。
通常,您可以使用该echo
命令来查看外壳如何解释您的参数。
$ echo foo$bar
foo # literal 'foo' plus the (empty) shell variable $bar
$ echo foo\$bar
foo$bar # backslash prevents expansion of $bar as a variable
$ echo "foo$$bar" # weaker double quote doesn't prevent expansion so
foo9691bar # the $$ expands to the unix process id (pid) of the current shell
$ echo 'foo$$bar'
foo$$bar # "stronger" single quote prevents shell expansion
$ echo "foo'bar"
foo'bar # double quote allows single quote within the literal
后续:bash shell(可能还有其他一些)允许在单引号引起来的字符串中转义单引号,尽管约定很奇怪(可能是基于一些早已被人们遗忘的决定,但现在却被时间迷惑了):
将整个字符串替换为单引号之前,用替换'
字符串内部的每个字符串,'\''
以便将文字字符串foo'bar
表示为'foo'\''bar'
。
就像我说的那样,离奇。这是必要的,因为一个反斜杠一个单引号字符的单引号外,一个反斜杠没有在bash单引号字符串中,单引号的字符串可以由多个单引号,只要没有转义关闭并重新打开具有特殊含义的中间字符。因此,'\''
关闭字符串的引用,然后提供转义的文字,然后重新打开字符串的引用。