将BASH关联数组传递给PHP脚本
是否可以将BASH关联数组作为argv传递给PHP脚本 我有一个bash脚本,它将一些变量收集到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
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脚本从用户输入中收集数据(通过bashread
函数),并将它们存储到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 "}"