Passa da una stringa a una matrice di "parole" in Bash


11

Devo passare da una stringa a un array in cui ogni voce è ogni parola su quella stringa. Ad esempio, a partire da:

VotePedro="Vote for Pedro"

Ho bisogno dell'array:

Vote
For
Pedro

Che dovrei quindi essere in grado di ripetere come:

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

Risposte:


11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})

Potresti spiegare cosa fanno le parentesi e le parentesi? Sono nuovo di BASH e voglio capire perché questo dovrebbe funzionare.
farid99,

1
Le matrici sono generalmente dichiarate usando le parentesi. Ad esempio votePedroArray=("Vote" "For" "Pedro"), ti darebbe una matrice di lunghezza 3. Ed ${VotePedro}è la stessa $VotePedrodi questo contesto. Per accedere ai singoli elementi dell'array, puoi usare parentesi simili a quelle che avevi per il ciclo for nella tua domanda. es. ${votePedroArray[0]}è il primo elemento dell'array ("Vota" per questo esempio)
airfishey

Grazie per la tua risposta. Vorrei votare ma non ho ancora abbastanza reputazione.
farid99,

2
E per iterare su di loro: per votare in $ {votePedroArray [@]}; fai eco $ voto; fatto
Neil McGill il

4

Quando si lascia una espansione variabile non quotata, ad esempio $VotePedro, vengono eseguiti i seguenti passaggi:

  1. Cerca il valore della variabile.
  2. Dividi il valore in ciascun blocco di spazi bianchi in un elenco di stringhe. Più in generale, i separatori sono i caratteri nel valore della IFSvariabile; per impostazione predefinita è spazio, scheda e newline.
  3. Interpreta ogni elemento dell'elenco come modello jolly; per ogni elemento, se il modello corrisponde ad alcuni file, sostituisci quell'elemento con l'elenco dei nomi file corrispondenti.

Quindi puoi dividere una stringa in elementi delimitati da spazi bianchi (assumendo il valore predefinito di IFS) disattivando l'espansione jolly ed espandendo una variabile il cui valore è quella stringa al di fuori delle virgolette.

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

È possibile eseguire direttamente la divisione nel punto di utilizzo; questo funzionerebbe anche in shell come sh che non hanno array:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f

0

Oltre a romperlo $IFS, puoi anche romperlo su qualsiasi cosa ti piaccia:

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

... che consentirebbe anche campi null separati da spazi bianchi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.