2010-12-07 19 views
1

Je suis un débutant avec des scripts shell et j'ai beaucoup appris aujourd'hui. Ceci est une extension à cette question Assigning values printed by PHP CLI to shell variablesManipuler un tableau (imprimé par php-cli) en script shell

J'ai obtenu la solution pour lire une variable dans mon script shell. Maintenant, comment manipuler un tableau? Si je prépare un tableau dans mon code PHP et l'imprime, et echo dans mon shell, il affiche Array. Comment accéder à ce tableau dans le script shell? J'ai essayé la solution donnée dans how to manipulate array in shell script

Avec le code suivant: -
code 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 Code

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 

Je reçois cette sortie: -

Array - 0 
- 1 
- 2 
- 3 
- 4 

Alors que je veux obtenir ceci: -

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

Répondre

2

Vous devriez déboguer votre script PHP premier à produire le contenu de tableau valide, le code

print $associativeArray; 

va simplement vous obtenir ce qui suit sortie:

$ php test.php 
Array 

Vous peut simplement imprimer le tableau associatif dans une boucle foreach:

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

donnant une liste de noms de variables + contenu séparés par ':'

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

En ce qui concerne le script shell , je suggérer en utilisant shell simple et compréhensible construit et ensuite obtenir les plus avancés (comme ${#result}) pour les utiliser correctement.

J'ai essayé le script bash suivant pour obtenir les variables de sortie du script PHP script 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 
+0

Merci et +1 pour la suggestion d'utiliser d'abord des constructions de coque simples et compréhensibles, puis d'arriver à l'advan. ced ones –

0

Vous ne dites pas ce shell que vous utilisez, mais en supposant qu'il est celui qui prend en charge des réseaux:

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 

Cela va être un tableau indexé plutôt qu'un tableau associatif. Alors que les tableaux associatifs sont supportés dans Bash 4, vous devrez utiliser une boucle similaire à celle de Martin Kosek pour l'assignation si vous voulez les utiliser.

+0

J'utilise linux bash shell –

+0

@Sandeepan Nath: Ma réponse s'applique à Bash. –

2

Avec bash4, vous pouvez utiliser mapfile pour remplir une substitution de la matrice et le processus pour l'alimenter:

mapfile -t array < <(your_command) 

Ensuite, vous pouvez passer par le tableau avec:

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

Ou utiliser des indices:

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