2010-11-15 4 views
1

j'ai une commande qui sort quelque chose comme ça:Shell lire de la ligne de chat par ligne dans un tableau

lucid32 
lucid64 

Je dois le lire dans un tableau. Donc, dans ce cas particulier, je besoin d'un équivalent de:

boxes =(lucid32 lucid64) 

J'ai essayé de le lire comme ça:

boxes=(`mycommand list | tr '\n' ' '`) 

mais retourne $ '\ 033' [0Klucid

Comment puis-je répare ça?

mise à jour:

il semble que ça ne fonctionne pas parce que cette commande génère un tas d'ordure:

\r\e[0Klucid32\n\r\e[0Klucid64\n 
+0

Je me demande si 'boxes = (chaînes <(mycommand list))' fonctionnera (en supposant bash ou un shell qui groks substitution de processus) –

Répondre

1

Quelle coque? Certains ne prennent pas en charge les tableaux. Les "indésirables" que vous voyez sont des codes de contrôle terminal pour le mouvement du curseur ou la coloration du texte, etc. Il s'agit probablement d'un code à effacer jusqu'à la fin de la ligne.

Quelle commande produit ces caractères? Certaines commandes désactiveront automatiquement ces codes lorsque leur sortie se rendra ailleurs que dans un tty. D'autres ont des options de ligne de commande pour désactiver cela. Il y a aussi des utilitaires qui enlèveront les codes pour vous.

1

Essayez avec boxes=$(mycommand list | tr '\n' ' ')

1

Essayez

boxes=(`mycommand list | xargs`) 
1

Comment à ce sujet (en bash):

boxes=(); while read l; do boxes+=("$l"); done < <(mycommand list) 

Cela placera chaque ligne de sortie dans un élément de tableau séparé. Alors que ceci:

boxes=(); while read l; do boxes+=("$l"); done < <(mycommand list | tr "$IFS" '\n') 

va également séparer les éléments sur les délimiteurs de paramètres de l'interpréteur. Cela se séparera sur les espaces:

boxes=(); while read l; do boxes+=("$l"); done < <(mycommand list | tr '[:space:]' '\n') 

Ce n'est pas aussi vite que certaines des autres solutions, mais vous pouvez contrôler comment mieux stocker les éléments du tableau.

Questions connexes