Перейдіть від рядка до масиву "слів" на Bash


11

Мені потрібно перейти від рядка до масиву, де кожен запис є кожним словом у цьому рядку. Наприклад, починаючи з:

VotePedro="Vote for Pedro"

Мені потрібен масив:

Vote
For
Pedro

Який тоді я мав би змогу повторити як:

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

Відповіді:


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

Чи можете ви пояснити, що роблять дужки та дужки? Я новачок у БАШі і хочу зрозуміти, чому це буде працювати.
farid99

1
Масиви зазвичай оголошуються за допомогою дужок. Наприклад votePedroArray=("Vote" "For" "Pedro"), ви отримаєте масив довжиною 3. І ${VotePedro}такий же, як $VotePedroу цьому контексті. Для доступу до окремих елементів масиву ви можете використовувати дужки, подібні до того, що ви мали для циклу for у своєму запитанні. наприклад, ${votePedroArray[0]}це перший елемент у масиві ("Проголосувати" для цього прикладу)
airfishey

Дякую за вашу відповідь. Я б підтримав, але ще не маю достатньої репутації.
farid99

2
І повторити їх: для голосування в $ {votePedroArray [@]}; робити ехо $ голосування; виконано
Ніл Макгілл

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.