コマンドライン引数は、システムのコマンドシェルによる解釈の対象となり、呼び出されたプログラムに渡される前に、コマンドの動作を変更したり、引数の値を変更したりします。
引数(の値など--password
)にシェルが解釈できる文字が含まれている場合、それらを引用符'
で囲む(通常はUNIX では一重引用符で囲むか"
、Windowsでは二重引用符で囲む)か、個別にエスケープする(通常は\
各メタ文字の前にバックスラッシュを付ける) )シェルによる解釈を避けるため。
特定の文字はシステム固有ですが、注意が必要な文字には次のものがあります。
$ & ! \ [ ] < > `
本当に悪い例として、パスワードが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シェル(およびおそらく他のいくつか)では、単一引用符で囲まれた文字列内の単一引用符をエスケープできます。
'
文字列'\''
全体を一重引用符で囲む前に、文字列内のそれぞれをで置き換えます。そのため、リテラル文字列foo'bar
はとして表され'foo'\''bar'
ます。
私が言ったように、奇妙です。バックスラッシュは単一引用符付き文字列の外側の単一引用符をエスケープし、バックスラッシュはbash内の単一引用符付き文字列の内側では何もエスケープしないため、これが必要です。特別な意味を持つ介在する文字。したがって'\''
、文字列の引用符を閉じ、エスケープされたリテラルを提供してから、文字列の引用符を再び開きます。