将变量从 BASH 传递给 PHP

Gra*_*ant 3 php variables bash

我正在使用 bash 脚本来触发 PHP 脚本,但我似乎无法将变量放入 PHP ...

Bash 脚本,其中 $1=mymusic.mp3

php /var/www/html/wave/waveform.php $1;
Run Code Online (Sandbox Code Playgroud)

PHP

$mp3 = '/var/www/html/processed/' . $argv[1];
copy($mp3, "$tmpname}_0.mp3");
Run Code Online (Sandbox Code Playgroud)

$argv[1]PHP 只是没有收到该变量。有任何想法吗?

axi*_*iac 5

您在评论中说您php5-cgi用于运行脚本。

php5-cgi是解释器的CGI 版本;其目的是供 Web 服务器使用。

如果要在命令行上运行脚本,则必须使用 CLI 版本的解释器。它的名字是php(或者,可能,php5在你的系统上)。

解释器的 CLI 和 CGI​​ 版本处理某些事情的方式不同。变量的内容$argc$argv是这些差异之一。

CGI 版本仅在register_argc_argv选项设置为On(或1) in 时填充它们php.ini。出于性能原因,此选项通常Off用于 CGI。

另一方面,无论选项的值如何,CLI 版本都会使用命令行中收到的参数填充$argc$argv变量register_argc_argv

正如@andlrc 在他们的回答中也指出的那样,$1在 shell 脚本中构造命令行时应该用双引号括起来,以防止 shell 将其拆分为单词:

php /var/www/html/wave/waveform.php "$1"
Run Code Online (Sandbox Code Playgroud)

如果,例如,该值$1foo bar(两个字),你原来的使用呈现到php waveform.php foo barprint_r($argv)显示如下:

Array
(
    [0] => waveform.php
    [1] => foo
    [2] => bar
)
Run Code Online (Sandbox Code Playgroud)

另一方面,如果$1用引号引起来,命令行就会变成php waveform.php "foo bar",并且 shellfoo bar作为单个参数传递给 PHP 脚本。Aprint_r($argv)输出:

Array
(
    [0] => waveform.php
    [1] => foo bar
)
Run Code Online (Sandbox Code Playgroud)

作为一个方面说明,存在丢失{copy($mp3, "$tmpname}_0.mp3");。应该是“copy($mp3, "${tmpname}_0.mp3");