Passer d'une chaîne à un tableau de «mots» dans Bash

11

J'ai besoin de passer d'une chaîne à un tableau où chaque entrée correspond à chaque mot de cette chaîne. Par exemple, en commençant par:

VotePedro="Vote for Pedro"

J'ai besoin du tableau:

Vote
For
Pedro

Je devrais ensuite pouvoir répéter:

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

Réponses:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
airfishey
la source
Pourriez-vous expliquer ce que font les parenthèses et les crochets? Je suis nouveau chez BASH et je veux comprendre pourquoi cela fonctionnerait.
farid99
1
Les tableaux sont généralement déclarés à l'aide de parenthèses. Par exemple votePedroArray=("Vote" "For" "Pedro"), vous obtiendrez un tableau de longueur 3. Et ${VotePedro}est le même que $VotePedrodans ce contexte. Pour accéder aux éléments de tableau individuels, vous pouvez utiliser des crochets similaires à ceux que vous aviez pour la boucle for dans votre question. par exemple, ${votePedroArray[0]}est le premier élément du tableau ("Votez" pour cet exemple)
airfishey
Merci pour votre réponse. J'aimerais voter mais je n'ai pas encore assez de réputation.
farid99
2
Et pour les parcourir: pour voter dans $ {votePedroArray [@]}; echo $ vote; fait
Neil McGill
4

Lorsque vous laissez une expansion variable sans guillemets, par exemple $VotePedro, les étapes suivantes sont effectuées:

  1. Recherchez la valeur de la variable.
  2. Divisez la valeur de chaque bloc d'espaces en une liste de chaînes. Plus généralement, les séparateurs sont les caractères de la valeur de la IFSvariable; par défaut, c'est l'espace, la tabulation et la nouvelle ligne.
  3. Interpréter chaque élément de la liste comme un motif générique; pour chaque élément, si le modèle correspond à certains fichiers, remplacez cet élément par la liste des noms de fichiers correspondants.

Ainsi, vous pouvez diviser une chaîne en éléments délimités par des espaces (en supposant la valeur par défaut de IFS) en désactivant l'expansion générique et en développant une variable dont la valeur est cette chaîne en dehors des guillemets.

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

Vous pouvez directement effectuer la division au point d'utilisation; cela fonctionnerait même dans des shells tels que sh qui n'ont pas de tableaux:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f
Gilles 'SO- arrête d'être méchant'
la source
0

En plus de le casser $IFS, vous pouvez également le casser sur ce que vous voulez:

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

... ce qui permettrait même des champs nuls séparés par des espaces.

mikeserv
la source