2010-12-07 12 views
1

私はシェルスクリプトを持つ初心者です。 これはこの質問の拡張ですAssigning values printed by PHP CLI to shell variablesシェルスクリプトの配列操作(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 

- :私は、次のコードでhow to manipulate array in shell script

で与えられた解決策を試してみました 私はこれを取得したいのに対し

Array - 0 - 1 - 2 - 3 - 4 

: -

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

答えて

2

あなたが有効な配列のコンテンツを生成するために最初にあなたのPHPスクリプト、コードをデバッグする必要があり

print $associativeArray; 

あなたに以下を取得します出力:

$ php test.php 
Array 

私は、シェルスクリプトについては

$ php test.php 
BASE_PATH:1 
db_host:2 
db_name:3 
db_user:4 
db_pass:5 

で区切られた変数名+コンテンツのリストを与える
foreach ($associativeArray as $key=>$val){ 
    echo "$key:$val\n"; 
} 

「:」単にforeachループで連想配列を印刷することができますシンプルでわかりやすいシェル構造を使用して、それらを正しく使用するために高度なもの(${#result}など)を入手することをお勧めします。

私はシェルスクリプトにPHPスクリプトの出力から変数を取得するには、次のbashスクリプトを試してみました:

# 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

シンプルでわかりやすいシェル構成を最初に使用してからアドバンに行くことをお勧めしますcedもの –

0

あなたが使用しているシェル言うが、それは配列をサポート一つだと仮定しないでください。

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の答えのようなループを使用して割り当てる必要があります。bash4で

+0

私はLinuxのbashシェルを使用しています –

+0

@Sandeepan Nath:私の答えはBashに当てはまります。 –

2

、あなたはそれを養うために、配列やプロセスの置換を移入するマップファイルを使用することができます。

mapfile -t array < <(your_command) 

次にあなたが配列を通過することができます

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

または使用のインデックス:

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