如何在命令行上禁用 $ 字符转义

gue*_*324 3 shell quoting

我阅读了无数关于此的主题,但没有一个解决此问题。

我需要在命令行上执行一个 MySQL 表达式,该表达式包含$被转义的表达式,因此会破坏 MySQL 的行为

mysql -u root -p -e "some statement that change a pa$$word"
Run Code Online (Sandbox Code Playgroud)

有人告诉我检查它 printf

printf "%q\n" 'pa$$word'
pa\$\$word
Run Code Online (Sandbox Code Playgroud)

所以我不需要逃避,$否则错误的密码会被输入到 MySQL 查询中。

小智 9

你误解了一些机制。

当您将短语放在单引号中时,即',没有扩展并且您不必转义$s。扩展意味着有特殊字符,如$,如果未转义,则会触发特殊的 shell 程序。所以当你用单引号抑制扩展时,你不需要转义它们。因此使用:

mysql -u root -p -e 'some statement that change a pa$$word'
Run Code Online (Sandbox Code Playgroud)

至于printf,你所做的不是检查。调用它%q会在$s 中添加反斜杠。

如果某些东西不起作用,那是因为$$被更改为 shell 的 PID(进程 ID)。这就是 shell 在其正常上下文中对这种特殊字符组合的构成,即。当它们没有被转义或放在单引号内时。