Bash - 变量包含美元符号

Bash - 变量包含美元符号

我有一个 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

如果execphp 中的该功能是通过 实现的sh -c cmd,则需要调用:

 exec("bash.sh '$path'")

在你的 shell 脚本中,似乎没有问题,因为$$只有当你使用eval.

相关内容