Vai de uma string para uma matriz de "palavras" no Bash

10

Eu preciso ir de uma string para uma matriz onde cada entrada é cada palavra nessa string. Por exemplo, começando com:

VotePedro="Vote for Pedro"

Eu preciso da matriz:

Vote
For
Pedro

Qual eu deveria então ser capaz de repetir como:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done
    
por farid99 08.07.2015 / 20:29

3 respostas

8
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
    
por 08.07.2015 / 20:34
4

Quando você deixa uma expansão variável sem aspas, por exemplo $VotePedro , as seguintes etapas são executadas:

  1. Pesquise o valor da variável.
  2. Divida o valor em cada bloco de espaço em branco em uma lista de seqüências de caracteres. Mais geralmente, os separadores são os caracteres no valor da variável IFS ; por padrão, é espaço, tabulação e nova linha.
  3. Interprete cada elemento da lista como padrão curinga; para cada elemento, se o padrão corresponder a alguns arquivos, substitua esse elemento pela lista de nomes de arquivos correspondentes.

Assim, você pode dividir uma string em elementos delimitados por espaços em branco (assumindo o valor padrão de IFS ) desligando a expansão de curingas e expandindo uma variável cujo valor é aquela string fora das aspas.

VotePedro="Vote for Pedro"
set -f
votePedroArray=($VotePedro)
set +f
for i in "${votePedroArray[@]}"; do …

Você pode fazer a divisão diretamente no ponto de uso; isso funcionaria mesmo em shells como sh que não possuem arrays:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  …
done
set +f
    
por 09.07.2015 / 02:39
0

Além de quebrá-lo em $IFS , você também pode dividi-lo no que quiser:

set ''
while case $var in
      (* *) ;; (*)
      ! a=("$var$@")
      esac
do    set '' "${var##* }$@"
      var=${var% "$2"}
done

... que permitiria campos nulos separados por espaços em branco, mesmo.

    
por 09.07.2015 / 07:34