是否可以将 BASH 关联数组作为 argv 传递给 PHP 脚本?
我有一个 bash 脚本,它将一些变量收集到像这样的 bash 关联数组中。之后,我需要将它发送到 PHP 脚本:
typeset -A DATA
DATA[foo]=$(some_bash_function "param1" "param2")
DATA[bar]=$(some_other_bash_function)
php script.php --data ${DATA[@]}
在 PHP 脚本中,我需要按以下方式访问数组:
<?php
$vars = getopt("",array(
"data:"
));
$data = $vars['data'];
foreach ($data as $k=>$v) {
echo "$k is $v";
}
?>
我尝试过的
--data
参数的奇怪语法遵循 great post about bash arrays from Norbert Kéri 的建议如何强制将传递的参数作为数组:
You have no way of signaling to the function that you are passing an array. You get N positional parameters, with no information about the datatypes of each.
但是这个解决方案仍然不适用于关联数组——只有值被传递给函数。 Norbert Kéri 做了一个follow up article关于这一点,但是它基于 eval
的解决方案对我不起作用,因为我需要将实际数组作为参数传递。
我想要实现的目标是不可能的还是有什么办法?谢谢!
更新:我想要完成的事情
我有一些具有以下结构的 PHP 配置文件:
<?php
return array(
'option1' => 'foo',
'option2' => 'bar'
)
我的 bash 脚本从用户输入中收集数据(通过 bash read
函数)并将它们存储到 bash 关联数组中。该数组稍后应作为参数传递给 PHP 脚本。
php script.php --file "config/config.php" --data $BASH_ASSOC_ARRAY
所以不用复杂的 sed
函数等。我可以做简单的:
<?php
$bash_input = getopt('',array('file:,data:'));
$data = $bash_input['data'];
$config = require($config_file);
$config['option1'] = $data['option1'];
$config['option2'] = $data['option2'];
// or
foreach ($data as $k=>$v) {
$config[$k] = $v;
}
// print to config file
file_put_contents($file, "<?php \n \n return ".var_export($config,true).";");
?>
这用于配置 Laravel 配置文件
最佳答案
@will 的不同方法
您的 bash 脚本:
typeset -A DATA
foo=$(some_bash_function "param1" "param2")
bar=$(some_other_bash_function)
php script.php "{'data': '$foo', 'data2': '$bar'}"
PHP 脚本
<?php
$vars = json_decode($argv[1]);
$data = $vars['data'];
foreach ($data as $k=>$v) {
echo "$k is $v";
}
?>
编辑(更好的方法) 感谢@will
typeset -A DATA
DATA[foo]=$(some_bash_function "param1" "param2")
DATA[bar]=$(some_other_bash_function)
php script.php echo -n "{"; for key in ${!DATA[@]}; do echo - "'$key'":"'${DATA[$key]}'", | sed 's/ /,/g' ; done; echo -n "}"
关于php - 将 BASH 关联数组传递给 PHP 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25381410/