Управление массивом (печатается с помощью php-cli) в сценарии оболочки - PullRequest
1 голос
/ 07 декабря 2010

Я новичок со сценариями оболочки, и сегодня я многому научился. Это расширение к этому вопросу Назначение значений, напечатанных PHP CLI, переменным оболочки

Я получил решение прочитать переменную в моем сценарии оболочки. Теперь, как манипулировать массивом? Если я подготовлю массив в своем коде PHP и напечатаю его, а в моей оболочке отобразится эхо, он отобразит массив. Как получить доступ к этому массиву в сценарии оболочки? Я пробовал решение, данное в , как манипулировать массивом в сценарии оболочки

Со следующим кодом: -
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;

Код оболочки

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 ]

2 голосов
/ 15 марта 2013

С bash4 вы можете использовать mapfile для заполнения массива и подстановки процесса для его подачи:

mapfile -t array < <( your_command )

Затем вы можете пройти через массив:

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

Или используйте индексы:

for i in "${#array[@]}"
do
   : use "${array[i]}"
done
2 голосов
/ 08 декабря 2010

Сначала вы должны отладить ваш 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

Что касается сценария оболочки , я предлагаю использовать простые и понятные конструкции оболочки , а затем перейти к более сложным (например, ${#result}), чтобы использовать их правильно.

Я пробовал следующий скрипт bash, чтобы получить переменные из вывода скрипта PHP в скрипт оболочки:

# 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
0 голосов
/ 08 декабря 2010

Вы не говорите, какую оболочку вы используете, но при условии, что она поддерживает массивы:

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, вам нужно будет использовать цикл, аналогичный тому, который был в ответе Мартина Косека для назначения, если вы хотите их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...