我有一个 php 脚本,它将变量传递给 bash 脚本:
exec("bash.sh $path")
bash 脚本如下所示:
#!/bin/bash
path=$1
echo $path
如果路径以美元符号结尾,如下所示:myfile.$$$
输出是:myfile.32577$
如何转义变量中的美元,以便回显准确?
答案1
PHPexec()
通过 shell 执行命令,因此即使在脚本运行之前,也会有一个 shell 来处理命令行。$$
shell 中的进程 id 是一个特殊变量,但对于任何其他看起来可能是变量的东西,您都会得到相同的变量。
这PHP 手册exec
明确提醒引用命令或 shell 处理的参数:
警告
当允许将用户提供的数据传递给此函数时,请使用escapeshellarg()或者escapeshellcmd()确保用户无法欺骗系统执行任意命令。
我找不到允许直接运行命令的system()
/ /others 版本(例如 Perl 中/的多参数版本),因此唯一的选择可能是使用exec()
system()
exec()
escapeshellarg()
。它用单引号引用参数并处理单引号。
$ php -r '$foo="$$$"; system("/bin/echo $foo");'
21836$
$ php -r '$foo="$$$"; system("/bin/echo " . escapeshellarg($foo));'
$$$
(您可以用来escapeshellcmd()
引用整个脚本,但我会避免需要这样做的情况:shell 语言足够复杂,在某些模糊的情况下引用很可能会失败。)
另外,正如 Kusalananda 提到的,(和往常一样)您仍然想在 Bash 脚本中引用变量。所以使用echo "$path"
而不是echo $path
.美元符号在这里不是问题,空格和通配符才是问题。
看:
- 分词 在格雷格的维基上,以及
- 什么时候需要双引号?
答案2
如果exec
php 中的该功能是通过 实现的sh -c cmd
,则需要调用:
exec("bash.sh '$path'")
在你的 shell 脚本中,似乎没有问题,因为$$
只有当你使用eval
.