Переход от строки к массиву «слов» в Bash

Мне нужно перейти от строки к массиву, где каждая запись – это каждое слово в этой строке. Например, начиная с:

VotePedro="Vote for Pedro" 

Мне нужен массив:

 Vote For Pedro 

Который я должен был бы иметь возможность перебирать как:

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

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

Когда вы оставляете переменную расширения без кавычек, например $VotePedro , $VotePedro следующие шаги:

  1. Посмотрите значение переменной.
  2. Разделите значение в каждом блоке пробелов в списке строк. В более общем смысле разделители являются символами значения переменной IFS ; по умолчанию это пространство, вкладка и новая строка.
  3. Интерпретировать каждый элемент списка как шаблон шаблона; для каждого элемента, если шаблон соответствует некоторым файлам, затем замените этот элемент на список совпадающих имен файлов.

Таким образом, вы можете разделить строку на элементы с разделителями пробелов (при условии значения по умолчанию IFS ), отключив расширение подстановочных знаков и расширив переменную, значение которой является той строкой вне кавычек.

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

Вы можете напрямую выполнять разделение в точке использования; это будет работать даже в оболочках, таких как sh, у которых нет массивов:

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

Кроме того, чтобы разбить его на $IFS , вы также можете просто сломать его на все, что вам нравится:

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

… что позволило бы исключить пустое поле без пробелов.