在bash中将多行输出捕获为数组

时间:2012-12-11 15:59:52

标签: bash

如果inner.sh

#...
echo first
echo second
echo third

outer.sh

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

如何用空格分割var

3 个答案:

答案 0 :(得分:68)

试试这个:

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

# And then test the array with:

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

<强>输出:

first
second
third

<强>解释

  • 例如,您可以通过执行var=(first second third)在bash中创建数组。
  • $(./inner.sh)运行inner.sh脚本,该脚本在不同的行上打印出firstsecondthird。因为我们没有在$(...)附近放置双引号,所以它们被集中在同一行上,但是用空格分隔,所以你最终会看到它在前一个项目符号中的样子。

答案 1 :(得分:35)

不要忘记内置mapfile。在你的情况下,它绝对是最有效的:如果你想在一个数组中啜饮整个文件,其中的字段将是./inner.sh输出的行,那么

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

然后你会在${array[0]}等第一行......

有关此内置和所有可能选项的更多信息:

help mapfile

如果您只需要名为firstline的变量中的第一行,请执行

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)

答案 2 :(得分:5)

你不是在空格上分裂而是在换行符上。 给这个旋转:

IFS=$'
'

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