在shell脚本中操作数组(由php-cli打印)

时间:2010-12-07 13:39:32

标签: linux arrays bash shell php

我是shell脚本的新手,今天我学到了很多东西。 这是此问题的扩展Assigning values printed by PHP CLI to shell variables

我得到了在shell脚本中读取变量的解决方案。现在如何操纵数组?如果我在我的PHP代码中准备一个数组并打印它,并在我的shell中回显,它会显示Array。如何在shell脚本中访问该数组?我尝试了how to manipulate array in shell script

中给出的解决方案

使用以下代码: -
PHP代码

$neededConstants = array("BASE_PATH","db_host","db_name","db_user","db_pass");

$associativeArray = array();
foreach($neededConstants as $each)
{
    $associativeArray[$each] = constant($each);
}

print $associativeArray;

Shell代码

function getConfigVals()
{
    php $PWD'/developer.php'
}




cd ..
PROJECT_ROOT=$PWD
cd developer

# func1 parameters: a b
result=$(getConfigVals)

for((cnt=0;cnt<${#result};cnt++))
do
    echo ${result[$cnt]}" - "$cnt
done

我得到了这个输出: -

Array - 0
 - 1
 - 2
 - 3
 - 4

我希望得到这个: -

Array
      BASE_PATH - /path/to/project
      db_host - localhost 
      db_name - database
      db_user - root 
      db_pass - root

3 个答案:

答案 0 :(得分:2)

您应首先调试 PHP脚本以生成有效的数组内容,代码

print $associativeArray;

只会得到以下输出:

$ php test.php 
Array

您只需在foreach循环中打印关联数组:

foreach ( $associativeArray as $key=>$val ){
    echo "$key:$val\n";
}

列出由':'

分隔的变量名称+内容
$ php test.php 
BASE_PATH:1
db_host:2
db_name:3
db_user:4
db_pass:5

对于 shell脚本,我建议使用简单易懂的shell构造,然后使用高级的(如${#result})正确使用它们

我已尝试使用以下bash脚本将变量从PHP脚本输出到shell脚本:

# set the field separator for read comand
IFS=":"

# parse php script output by read command
php $PWD'/test.php' | while read -r key val; do
    echo "$key = $val"
done

答案 1 :(得分:2)

使用bash4,您可以使用mapfile填充数组并处理替换以提供它:

mapfile -t array < <( your_command )

然后你可以通过以下方式浏览数组:

for line in "${array[@]}"

或使用指数:

for i in "${#array[@]}"
do
   : use "${array[i]}"
done

答案 2 :(得分:0)

你没有说你正在使用什么shell,但假设它是支持数组的那个:

result=($(getConfigVals))    # you need to create an array before you can ...

for((cnt=0;cnt<${#result};cnt++))
do
    echo ${result[$cnt]}" - "$cnt    # ... access it using a subscript
done

这将是一个索引数组,而不是一个关联数组。虽然在Bash 4中支持关联数组,但是如果要使用它们,则需要使用类似于Martin Kosek的答案中的循环来进行分配。