2009-02-20 11 views
0

Je suis en train d'analyser/proc/cmdline dans mes initramfs en utilisant une déclaration de cas.tourner correspondance de cas dans des globes marins un tableau

CMDLINE=`cat /proc/cmdline` 

for param in $CMDLINE ; do 
    case "$param" in 
    root=*|init=*) 
     eval "$param" 
    ;; 
    rescue) 
     escue="y" 
    ;; 
    drive*) 
     echo -n $param 
    ;; 
    esac 
done 

Maintenant, le problème est là que j'ai * d'entraînement, je veux prendre plusieurs instances de route de cmdline et les analyser tous dans un tableau.

So/proc/cmdline peut ressembler à ceci.

/dev/mapper/Betsy-root vga=792 quiet=y opt2=bar opt1=bar op3=bar drive1="abcde:key.gpg" drive2="qrstuv:key2.gpg" drive3="foobar:false" 

Le problème est lors de l'instruction case lorsque je conduis *) $ param ressemble maintenant à ceci.

drive1="abcde:key.gpg"drive2="qrstuv:key2.gpg"drive3="foobar:false" 

Si curieux la meilleure façon d'accomplir ce que je veux. Ce qui serait de créer dynamiquement un tableau de disques. Par exemple

drive[0] 
drive[1] 
drive[2] 

Ce que j'ai essayé de faire était tout simplement à la recherche de [a-zA-Z] » et l'insertion d'une nouvelle ligne. De cette façon, ils seraient séparés et je pourrais les jeter dans un tableau. Bien que je ne J'ai eu de la chance pour que cela fonctionne comme je l'espérais ... Donc, avec tout ce que j'ai dit ...

Ne sachant pas combien d'instances il y aura dans/proc/cmdline, comment puis-je pousser chaque disque [0-9] dans un tableau. Ou peut-être c'est juste un mauvais endroit pour une déclaration de cas? Tout conseil serait apprécié.

Répondre

2
drive*) 
    drive_array+=($param) 

bam! yo J'ai votre tableau. Pour la compatibilité avec les versions bash âgées:

drive*) 
    drive_array=("${drive_array[@]}" $param) 

Si la chaîne d'origine avait un espace entre les = d'entraînement, votre bien. S'il y a certains cas où ils ne n'ont pas des espaces, vous devez faire un travail supplémentaire:

drive*) 
    drive_array+=(${param//drive/ drive}) 

qui fait une substitution globale pour ajouter un espace en face de chaque disque, de cette façon, il est divisé en différents éléments dans le tableau. Faites la même transformation pour le rendre compatible avec les anciennes versions si vous le souhaitez.

+0

echo $ drive_array affiche uniquement le premier élément du tableau. Comme mentionné ci-dessus, le plus gros problème est $ param est de concaténer chaque disque en une grande chaîne. Ainsi, au lieu de drive1 = "foo" drive2 = "bar", il renvoie drive1 = "foo" drive2 = "bar", ceux-ci doivent être séparés avant de pouvoir créer un tableau. – gregf

+0

Ils sont répartis dans le tableau, ce qui est exactement ce que vous avez demandé. Peut-être que vous devez apprendre à utiliser un tableau de bash? Essayez google. Essayez: echo $ {drive_array [1]} ou echo "$ {drive_array [@]}". –

+0

Vous pensez que vous me comprenez mal. Quand vous obtenez $ param tout est écrasé, il n'y a pas d'espace entre chaque disque. Donc, comme je l'ai dit $ param ressemble à ceci. drive1 = "foo" drive2 = "barre" aucun espace entre eux. Donc, lorsque vous créez le tableau, son seul élément n'est pas deux – gregf

Questions connexes