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


11

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

VotePedro="Vote for Pedro"

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

Vote
For
Pedro

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

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

Ответы:


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

Не могли бы вы объяснить, что делают скобки и скобки? Я новичок в 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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.