Подтвердить что ты не робот

Захват многострочного вывода в виде массива в bash

Если inner.sh есть

#...
echo first
echo second
echo third

И outer.sh есть

var=`./inner.sh`
# only wants to use "first"...  

Как var можно разбить по пробелам?

4b9b3361

Ответ 1

Попробуйте следующее:

var=($(./inner.sh))

# And then test the array with:

echo ${var[0]}
echo ${var[1]}
echo ${var[2]}

Вывод:

first
second
third

Объяснение:

  • Вы можете сделать массив в bash, выполнив var=(first second third), например.
  • $(./inner.sh) работает inner.sh script, который выводит first, second и third на отдельные строки. Поскольку мы не добавляем двойные кавычки вокруг $(...), они попадают в одну и ту же строку, но разделяются пробелами, поэтому вы получаете то, что похоже на предыдущую маркерную точку.

Ответ 2

Не забывайте встроенный mapfile. Это определенно наиболее эффективно в вашем случае: если вы хотите разрезать весь файл в массиве, полями которого будут строки, выводимые ./inner.sh, do

mapfile -t array < <(./inner.sh)

Тогда у вас будет первая строка в ${array[0]} и т.д.

Для получения дополнительной информации об этом встроенном и всех возможных вариантах:

help mapfile

Если вам нужна только первая строка в переменной под названием firstline, do

read -r firstline < <(./inner.sh)

Это, безусловно, наиболее эффективные способы!

Этот небольшой тест докажет это:

$ time mapfile -t array < <(for i in {0..100000}; do echo "fdjsakfjds$i"; done)

real    0m1.514s
user    0m1.492s
sys 0m0.560s
$ time array=( $(for i in {0..100000}; do echo "fdjsakfjds$i"; done) )

real    0m2.045s
user    0m1.844s
sys 0m0.308s

Если вам нужно только первое слово (с разделителем пробела) первой строки, выводимой ./inner.sh, наиболее эффективным способом является

read firstword _ < <(./inner.sh)

Ответ 3

Вы не разделяете пробелы, а скорее на линиях новой строки. Дайте этому вихрь:

IFS=$'
'

var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS