2010-03-20 5 views
2

Pourquoi cela ne fonctionne-t-il pas ???ksh: affecter la sortie de la fonction à un tableau

#!/bin/ksh 

# array testfunc() 
function testfunc { 
    typeset -A env 
    env=(one="motherload") 
      print -r $env 
    return 0 
} 

testfunC# returns: (one=motherload) 
typeset -A testvar # segfaults on linux, memfaults on solaris 
testvar=$(testfunc) # segfaults on linux, memfaults on solaris 
print ${testvar.one} 

Note: Je mis à jour le script ci-dessus pour print ${testvar.one} de print $testvar pour montrer plus précisément ce que je suis en train d'accomplir.

Je suis sûr que cela a déjà été demandé, mais je ne suis pas sûr de quoi rechercher et tout ce que j'ai essayé d'utiliser pour les mots-clés ne m'apporte pas de réponses qui se rapportent à mon problème.

version ksh:

linux: version sh (AT&T Research) 1993-12-28 s+

solaris: version sh (AT&T Research) 93s+ 2008-01-31

Mise à jour:

Donc, une autre question est, cela se déroulera dans ksh 93T + sans donner une erreur, mais il n'attribue pas le tableau correctement. Je voudrais j'attribuer un tableau à partir d'une fonction? J'ai essayé d'assigner le tableau comme ceci aussi:

typeset -A testvar=$(testfunc) 
print ${testvar.one} 

Mais cela aussi ne fonctionnait pas correctement.

EDIT

Alors qu'est-ce qui se passe ici?

typeset -A env=(one="motherload" two="vain") 
print ${env.one} 
print ${env.two} 

Je pensais que c'était la façon dont vous avez défini les tableaux associatifs, peut-être ce que je cherchais à était vieux mais qui sait .... semble comportement étrange car cela imprime « motherload » et « vain »

+0

quelle est votre version de ksh? – ghostdog74

+0

Voir ma réponse modifiée. –

+0

C'est ce qu'on appelle une variable composée. C'est semblable à une structure. Je clarifierai l'une des phrases de ma réponse. http://www.informit.com/articles/article.aspx?p=99035&seqNum=5 –

Répondre

2

Votre script fonctionne bien sur Linux avec ksh 93t +.

Comme c'est le même script et que vous obtenez des erreurs similaires dans deux environnements différents, je suspecterais des caractères parasites dans le fichier. Essayez l'un de ceux-ci pour montrer des caractères parasites qui pourraient être présents:

hd filename 
cat -v filename 
hexdump -C filename 

Si c'est tout simplement une question de fin de ligne DOS, cela va résoudre ce problème:

dos2unix filename 

Edit:

est ici une façon de créer et remplir un tableau associatif dans ksh:

$ typeset -A testvar 
$ testvar=([one]="motherlode" [two]="vein" [waste]="tailings") 
$ echo ${testvar[two]} 
vein 
$ testvar[ore]="gold" 
$ echo ${!testvar[@]} # print the indices of the array 
one two waste ore 
$ typeset -p testvar  # show the current definition of the array 
typeset -A testvar=([one]="motherlode" [two]="vein" [waste]="tailings" [ore]="gold") 

Comme vous pouvez le voir, ksh utilise des sous-scripts entre crochets pour les tableaux. La notation en pointillé est utilisée pour accéder aux membres d'un compound variable.

Je ne crois pas que les fonctions ksh puissent renvoyer des tableaux. Cependant, vous pouvez utiliser la technique d'impression que vous avez dans votre fonction (mais ajouter des crochets autour du nom de l'index) et utiliser eval pour effectuer l'assignation.

$ typeset -A testvar 
$ eval "testvar=($(testfunc))" 

ou pour ajouter à un tableau existant:

$ eval "testvar+=($(testfunc))" 

À moins que votre fonction utilise des réseaux associatifs en interne, vous ne pas nécessairement besoin de les utiliser pour construire votre sortie.

Cependant, si vous le faites, vous pouvez analyser à partir du résultat de typeset -p:

$ result=$(typeset -p env) 
$ result=${result#*\(} 
$ result=${result%\)*} 
$ print result 

ou itérer à travers le réseau:

$ for index in ${!env[@]}; do print -n "[$index]=${env[$index]} "; done; print 

Vous pouvez consulter la documentation concernant les fonctions de discipline et tapez les variables

+0

Ok, donc ça marche aussi pour moi sur ksh 93t + ... on dirait que c'était un problème dans les versions précédentes de <93s + ... – rcarson

+0

en fait ça ne fait pas erreur, ça ne donne pas les résultats que je cherchais. – rcarson

+0

Alors qu'est-ce que je fais exactement ici? < see edit > – rcarson

Questions connexes