Ir de una cadena a una matriz de "palabras" en Bash

11

Necesito ir de una cadena a una matriz donde cada entrada es cada palabra en esa cadena. Por ejemplo, comenzando con:

VotePedro="Vote for Pedro"

Necesito la matriz:

Vote
For
Pedro

Lo que debería poder repetir como:

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

Respuestas:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
Airfishey
fuente
¿Podría explicar qué hacen los paréntesis y los corchetes? Soy nuevo en BASH y quiero entender por qué esto funcionaría.
farid99
1
Las matrices generalmente se declaran usando paréntesis. Por ejemplo, votePedroArray=("Vote" "For" "Pedro")le daría una matriz de longitud 3. Y ${VotePedro}es lo mismo que $VotePedroen este contexto. Para acceder a elementos de matriz individuales, puede usar paréntesis similares a los que tenía para el bucle for en su pregunta. por ejemplo, ${votePedroArray[0]}es el primer elemento en la matriz ("Voto" para este ejemplo)
airfishey
Gracias por tu respuesta. Votaría pero aún no tengo suficiente reputación.
farid99
2
Y para iterar sobre ellos: para votar en $ {votePedroArray [@]}; hacer eco $ voto; hecho
Neil McGill
4

Cuando deja una expansión variable sin comillas, por ejemplo $VotePedro, se realizan los siguientes pasos:

  1. Busque el valor de la variable.
  2. Divida el valor en cada bloque de espacios en blanco en una lista de cadenas. Más generalmente, los separadores son los caracteres en el valor de la IFSvariable; por defecto, espacio, tabulación y nueva línea.
  3. Interprete cada elemento de la lista como un patrón comodín; para cada elemento, si el patrón coincide con algunos archivos, reemplace ese elemento por la lista de nombres de archivo coincidentes.

Por lo tanto, puede dividir una cadena en elementos delimitados por espacios en blanco (asumiendo el valor predeterminado de IFS) desactivando la expansión de comodines y expandiendo una variable cuyo valor es esa cadena fuera de las comillas.

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

Puede hacer la división directamente en el punto de uso; esto funcionaría incluso en shells como sh que no tienen matrices:

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

Además de romperlo $IFS, también puedes romperlo en lo que quieras:

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

... que permitiría espacios en blanco separados por campos nulos, incluso.

mikeserv
fuente