Przejdź od ciągu do zestawu „słów” w Bash

11

Muszę przejść od ciągu do tablicy, w której każdy wpis to każde słowo w tym ciągu. Na przykład, zaczynając od:

VotePedro="Vote for Pedro"

Potrzebuję tablicy:

Vote
For
Pedro

Które powinienem być w stanie powtórzyć jako:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done
farid99
źródło

Odpowiedzi:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
airfishey
źródło
Czy możesz wyjaśnić, co robią nawiasy i nawiasy? Jestem nowy w BASH i chcę zrozumieć, dlaczego to zadziała.
farid99
1
Tablice są zwykle deklarowane za pomocą nawiasów. Na przykład votePedroArray=("Vote" "For" "Pedro")daje tablicę o długości 3. I ${VotePedro}jest taka sama jak $VotePedrow tym kontekście. Aby uzyskać dostęp do poszczególnych elementów tablicy, możesz użyć nawiasów podobnych do tego, co miałeś dla pętli for w swoim pytaniu. np. ${votePedroArray[0]}jest pierwszym elementem w tablicy („Głosuj” w tym przykładzie)
airfishey
Dziękuję za odpowiedź. Chciałbym głosować, ale nie mam jeszcze wystarczającej reputacji.
farid99
2
I iterować nad nimi: za głos w $ {votePedroArray [@]}; powtórz głosowanie; gotowe
Neil McGill,
4

W przypadku pozostawienia cudzysłowu zmiennej, np. $VotePedroWykonywane są następujące kroki:

  1. Sprawdź wartość zmiennej.
  2. Podziel wartość w każdym bloku białych znaków na listę ciągów. Mówiąc bardziej ogólnie, separatory to znaki w wartości IFSzmiennej; domyślnie jest to spacja, tabulator i nowa linia.
  3. Interpretuj każdy element listy jako wzór wieloznaczny; dla każdego elementu, jeśli wzorzec pasuje do niektórych plików, zastąp ten element listą pasujących nazw plików.

W ten sposób możesz podzielić ciąg znaków na elementy rozdzielane spacjami (zakładając wartość domyślną IFS), wyłączając interpretację symboli wieloznacznych i rozwijając zmienną, której wartością jest ten ciąg poza cudzysłowami.

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

Możesz bezpośrednio dokonać podziału w miejscu użycia; działałoby to nawet w powłokach takich jak sh, które nie mają tablic:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f
Gilles „SO- przestań być zły”
źródło
0

Oprócz zepsucia $IFSmożesz też po prostu zepsuć to, co chcesz:

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

... co pozwoliłoby nawet na oddzielenie pustych pól pustymi spacjami.

mikeserv
źródło