将变量从PHP传递给Ubuntu shell脚本

时间:2014-10-16 08:50:44

标签: php shell postgresql-9.1

我有一个像这样的shell脚本(在/usr/local/bin/esm-script/import-master.php中):

#! /bin/bash 
echo "this is the file name $1."
script -c 'PGPASSWORD="pwd123" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "$1"' /dev/null

现在我通过这样的PHP脚本调用它:

$NewFile = "/var/www/...master-data.sql"; //full path
$strImport = '/usr/local/bin/esm-script/import-master.sh ' . $NewFile;  
$strMsg = shell_exec($strImport);
echo "$strMsg<br />";
echo 'done!';

但是,当我运行PHP代码时,这是我在浏览器上收到的消息:

this is the file name /var/www/ESM-Backend/uploads/master-data.sql. Script started, file is /dev/null Script done, file is /dev/null sh: 1: cannot open : No such file Script started, file is /dev/null
done! 

我不是一个shell脚本的人,所以我不知道我是否遗漏了什么。

我已经检查过带有sql文件的文件夹是否具有正确的权限(775)并且有数据(插入语句)。

那为什么这不起作用?任何想法和指导都非常感谢。

修改 我在shell脚本文件中对文件进行了硬编码,如下所示:

script -c 'PGPASSWORD="#UR!23" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "/var/www/ESM-Backend/uploads/master-data.sql"' /dev/null

它有效。但我需要它与通过PHP传递的文件一起运行。

2 个答案:

答案 0 :(得分:1)

我认为问题可能在于您将参数传递给shell脚本的方式,即$NewFile。从relevant SO Post开始,您可能希望尝试将参数括在双引号中,如下所示:

$strImport = '/usr/local/bin/esm-script/import-master.sh "'.$NewFile.'"';

我假设权限设置正确,您可以正常使用shell_exec()通过PHP执行shell脚本。希望这会有所帮助。

答案 1 :(得分:0)

首先,非常感谢Vivek给我使用引号的想法。然后我认为错误是命令行参数包含在shell脚本文件中的单引号内的方式。

所以我尝试了以下内容:

script -c 'PGPASSWORD="#UR!23" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "'$1'"' /dev/null

是的,它解决了这个问题。

这个想法是$ 1参数是在脚本命令的引用字符串之外给出的。

我还怀疑如何在bash中连接字符串,这是我找到的一个很好的链接:How to concatenate string variables in Bash?