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

将BASH关联数组传递给PHP脚本,php,bash,eval,associative-array,getopt,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

是否可以将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";
    }

?>
我的bash脚本从用户输入中收集数据(通过bash
read
函数),并将它们存储到bash关联数组中。该数组稍后应作为参数传递给PHP脚本

php script.php --file "config/config.php" --data $BASH_ASSOC_ARRAY
因此,与复杂的
sed
s函数等不同,我可以做简单的:

<?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配置文件的

这在一个bash脚本中实现了您想要的(我认为)功能。显然,您可以将php文件移出

declare -A assoc_array=([key1]=value1 [key2]=value2 [key3]=value3 [key4]=value4)

#These don't come out necesarily ordered
echo ${assoc_array[@]} #echos values
echo ${!assoc_array[@]} #echos keys

echo "" > tmp

for key in ${!assoc_array[@]}
do
echo $key:${assoc_array[$key]} >> tmp   # Use some delimeter here to split the keys from the values
done

cat > file.php << EOF
<?php

    \$fileArray = explode("\n", file_get_contents("tmp"));

    \$data = array();

    foreach(\$fileArray as \$line){
        \$entry = explode(":", \$line);
        \$data[\$entry[0]] = \$entry[1];
    }

    var_dump(\$data);

?>
EOF


php file.php
declare-A assoc_数组=([key1]=value1[key2]=value2[key3]=value3[key4]=value4)
#这些不是必须订购的
echo${assoc_数组[@]}echos值
echo${!assoc_数组[@]}echos键
echo'>tmp
对于${!assoc_数组[@]}中的键
做
echo$key:${assoc_array[$key]}>>tmp#在这里使用一些delimeter将键与值分开
完成

cat>file.php不同的@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";
    }

?>

能否将bash数组回送到一个临时文件,然后读取该文件?(尽管那会很难看)或者你可以把它们导入其中并阅读stdin?我是一个bash新手,所以我需要弄清楚如何“echo”或“pipe”先归档,以及它对我的案例有多大帮助。:)然而,如果你有时间详细说明答案。。。是的,我可以创建文件,因为我可以从主bash中创建
源代码
脚本。你一定要使用bash数组吗?@ZanderRootman:恐怕是这样,因为我正在从终端中的用户输入(
read
函数)收集数据……谢谢!我现在就试试看,一会儿就回来。威尔,你的方法奏效了,尽管我可能会接受(经过大量修改的)@ZanderRootman的方法。非常感谢,你教了我很多关于临时bash数据存储到文件的知识!谢谢!我将走这条路。:)这确实更干净,但我认为如果您将json编码自动化,会更好,比如${!assoc_数组[@]}中的键的
echo-n“{”;do echo-n“$key'”:“${assoc_数组[$key]}'”;完成;echo-n“}”
(我不知道json是否介意在结尾处添加额外的尾随逗号,因此您可能需要将其删除…是的,尾随逗号会破坏语法。但是删除不会伤害任何人。将快速更新答案这几乎是我目前正试图用Zander的代码完成的事情,但更加优雅。:)谢谢你们,你们帮了我很多忙!
<?php

    $vars = json_decode($argv[1]);

    $data = $vars['data'];

    foreach ($data as $k=>$v) {
          echo "$k is $v";
    }

?>
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 "}"