Vá de uma String para uma matriz de "palavras" no Bash

11

Eu preciso ir de uma seqüência de caracteres para uma matriz onde cada entrada é cada palavra nessa seqüência. Por exemplo, começando com:

VotePedro="Vote for Pedro"

Eu preciso da matriz:

Vote
For
Pedro

Que eu deveria ser capaz de iterar como:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done
farid99
fonte

Respostas:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
airfishey
fonte
Você poderia explicar o que os parênteses e os colchetes fazem? Eu sou novo no BASH e quero entender por que isso funcionaria.
precisa saber é
1
As matrizes geralmente são declaradas usando parênteses. Por exemplo votePedroArray=("Vote" "For" "Pedro"), você forneceria uma matriz de comprimento 3. E ${VotePedro}é a mesma que $VotePedroneste contexto. Para acessar elementos individuais da matriz, você pode usar colchetes semelhantes ao que você tinha para o loop for na sua pergunta. por exemplo, ${votePedroArray[0]}é o primeiro elemento da matriz ( "voto" para este exemplo)
airfishey
Obrigado pela sua resposta. Gostaria de votar, mas ainda não tenho reputação suficiente.
farid99
2
E para iterar sobre eles: para votar em $ {votePedroArray [@]}; faça eco de voto; feito
Neil McGill
4

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

  1. Procure o valor da variável.
  2. Divida o valor em cada bloco de espaço em branco em uma lista de cadeias. De maneira mais geral, os separadores são os caracteres no valor da IFSvariável; por padrão, é espaço, tabulação e nova linha.
  3. Interprete cada elemento da lista como um 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 sequência em elementos delimitados por espaço em branco (assumindo o valor padrão de IFS) desativando a expansão de curinga e expandindo uma variável cujo valor é essa sequência 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 matrizes:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f
Gilles 'SO- parar de ser mau'
fonte
0

Além de quebrá-lo $IFS, você também pode quebrá-lo como 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.

mikeserv
fonte