Зберігати вихід масиву в масив


23

Це команда: pdc status -a 2>&1 | grep 'okay'Вона дає наступний вихід

[okay     ]: you are currently listening: 33
[okay     ]: you are currently listening: 22
[okay     ]: you are currently listening: 11

Я написав цю команду у файл сценарію оболонки. Але я хочу зберігати вихід цієї команди в масив для деякої обробки на кожному з показників значення масиву.

Як я можу зберігати вихід цієї команди в масив?

Відповіді:


24

Якщо ви просто хочете цифри в кінці кожного рядка:

numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )

Якщо ви хочете зберегти кожен рядок у масиві

mapfile -t lines < <(pdc ...)

Щоб отримати дані з масивів:

for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11

[okay   ]: you are currently listening: 33
[okay   ]: you are currently listening: 22
[okay   ]: you are currently listening: 11

1
Помилка синтаксису: переадресація несподівана, коли я використовуюmapfile -t array < <(grep.....)
Sachith Muhandiram

Ви використовуєте bash чи якусь іншу оболонку?
Глен Джекман

20

Перш за все, вам не обов'язково потрібен масив, для обробки вихідного рядка за рядком ви можете:

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

Якщо вам потрібен масив, Глен Джекман вже дав вам найкращий спосіб зробити це, але ось інший підхід:

#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))

Пояснення:

  • $IFS=$'\n': $IFSє роздільником поля введення bash , встановлення його лише на символ нового рядка ( \n) гарантує, що ваші вихідні лінії не будуть розділені на пробіл, щоб ви могли зберегти кожен рядок як окремий елемент масиву. Без цього кожне слово результату вашої команди було б іншим елементом.

    Залежно від того, що ви хочете зробити, може бути хорошою ідеєю зберегти старе значення $IFSта відновити його після зчитування масиву:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Це називається підміна команд і дозволяє зберегти вихід команди в змінній. Є два способи зробити це:

    var=$(command)

    і

    var=`command`

    З двох $()кращих, тому що:

    • Він може працювати з вкладеними командами:

      var=$(command1 $(command 2))

      Наприклад var=$(cat $(find ~/))

    • У ньому набагато менше проблем із цитуванням і в результаті виходить чистіший синтаксис. Дивіться тут докладніше.


6

Ще один більш інтуїтивний спосіб використання readarrayвбудованого (див. help -m readarray):

readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"

Далі для друку елемента масиву, скажімо, другого елемента, ви можете використовувати:

echo "${array[1]}"

Для друку всіх елементів масиву в окремих рядках ви можете використовувати:

printf -- "%s\n" "${array[@]}"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.