Wechseln Sie von einem String zu einem Array von „Wörtern“ in Bash

11

Ich muss von einer Zeichenfolge zu einem Array wechseln, in dem jeder Eintrag jedes Wort in dieser Zeichenfolge ist. Beginnen Sie zum Beispiel mit:

VotePedro="Vote for Pedro"

Ich brauche das Array:

Vote
For
Pedro

Was ich dann wiederholen sollte als:

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

Antworten:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
airfishey
quelle
Können Sie erklären, was die Klammern und Klammern bewirken? Ich bin neu bei BASH und möchte verstehen, warum dies funktionieren würde.
Farid99
1
Arrays werden normalerweise in Klammern deklariert. Zum Beispiel votePedroArray=("Vote" "For" "Pedro")würde Ihnen ein Array der Länge 3 geben. Und ${VotePedro}ist das gleiche wie $VotePedroin diesem Zusammenhang. Um auf einzelne Array-Elemente zuzugreifen, können Sie Klammern verwenden, die denen für die for-Schleife in Ihrer Frage ähneln. zB ${votePedroArray[0]}ist das erste Element im Array ("Abstimmung" für dieses Beispiel)
airfishey
Danke für deine Antwort. Ich würde zustimmen, aber ich habe noch nicht genug Ruf.
farid99
2
Und um sie zu wiederholen: für die Abstimmung in $ {votePedroArray [@]}; Echo $ Vote; fertig
Neil McGill
4

Wenn Sie eine variable Erweiterung nicht in Anführungszeichen setzen, werden beispielsweise $VotePedrodie folgenden Schritte ausgeführt:

  1. Suchen Sie den Wert der Variablen.
  2. Teilen Sie den Wert an jedem Leerzeichenblock in eine Liste von Zeichenfolgen auf. Im Allgemeinen sind die Trennzeichen die Zeichen im Wert der IFSVariablen. Standardmäßig sind dies Leerzeichen, Tabulatoren und Zeilenumbrüche.
  3. Interpretieren Sie jedes Element der Liste als Platzhaltermuster. Wenn das Muster für jedes Element mit einigen Dateien übereinstimmt, ersetzen Sie dieses Element durch die Liste der übereinstimmenden Dateinamen.

Auf diese Weise können Sie eine Zeichenfolge in durch Leerzeichen getrennte Elemente aufteilen (wobei der Standardwert von angenommen wird IFS), indem Sie die Platzhaltererweiterung deaktivieren und eine Variable erweitern, deren Wert diese Zeichenfolge außerhalb von Anführungszeichen ist.

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

Sie können die Aufteilung direkt am Verwendungsort durchführen. Dies würde sogar in Shells wie sh funktionieren, die keine Arrays haben:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f
Gilles 'SO - hör auf böse zu sein'
quelle
0

Außerdem ist es brechen auf $IFS, können Sie auch brechen sie nur auf , was Sie wollen:

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

... was sogar durch Leerzeichen getrennte Nullfelder ermöglichen würde.

mikeserv
quelle