Сохранять вывод команды в массив

dig также может выполнять обратный поиск DNS с помощью avahi:

dig -x 192.168.0.1 @224.0.0.251 -p 5353

1
задан 25 March 2014 в 22:14

2 ответа

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

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 ~/)) У него гораздо меньше проблем с цитированием и приводит к более чистому синтаксису. См. Здесь больше.
19
ответ дан 24 May 2018 в 10:25

Еще один более интуитивный способ использования readarray builtin (см. help -m readarray):

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

Затем, чтобы напечатать элемент массива, скажем второй элемент, вы можете использовать: [!d1 ]

echo "${array[1]}"

Чтобы напечатать все элементы массива на отдельных строках, вы можете использовать:

printf -- "%s\n" "${array[@]}"
5
ответ дан 24 May 2018 в 10:25

Другие вопросы по тегам:

Похожие вопросы: