php - 将 BASH 关联数组传递给 PHP 脚本

标签 php bash eval associative-array getopt

是否可以将 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/

相关文章:

php - 拉拉维尔 8 : Undefined variable when loading a Blade into another Blade

linux "find"命令

javascript - 有没有办法在没有 eval() 的情况下操作包含的 JS?

r - 如何使用 ddply 以编程方式汇总多列?

php - 有什么好的方法可以防止恶意代理用户访问您的站点?

php - 使用 php 将多行更新到 mysql 数据库

php - Laravel Eloquent - pluck() 角色名称

Bash:嵌套变量扩展

Bash 模板 : How to build configuration files from templates with Bash?

perl - 我如何编写一个不在 eval block 中触发的 SIG{__DIE__} 处理程序?