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

11

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

VotePedro="Vote for Pedro"

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

Vote
For
Pedro

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

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done
farid99
источник

Ответы:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
airfishey
источник
Не могли бы вы объяснить, что делают скобки и скобки? Я новичок в BASH и хочу понять, почему это будет работать.
farid99
1
Массивы обычно объявляются в скобках. Например votePedroArray=("Vote" "For" "Pedro"), даст вам массив длины 3. И ${VotePedro}такой же, как $VotePedroв этом контексте. Чтобы получить доступ к отдельным элементам массива, вы можете использовать скобки, аналогичные тем, которые использовались для цикла for в вашем вопросе. Например, ${votePedroArray[0]}первый элемент в массиве (в данном примере «Проголосовать»)
airfishey,
Спасибо за Ваш ответ. Я бы поднял голос, но мне пока не хватает репутации.
farid99
2
И перебирать их: для голосования в $ {voicePedroArray [@]}; сделать эхо $ голосование; сделано
Нил МакГилл
4

Когда вы оставляете расширение переменной без кавычек, например $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
Жиль "ТАК - перестань быть злым"
источник
0

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

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

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

mikeserv
источник