86

如果inner.sh

#...
echo first
echo second
echo third

并且outer.sh

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

如何var用空格分割?

4

3 回答 3

132

试试这个:

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打印出firstsecond和。third由于我们没有在 周围加上双引号$(...),因此它们会集中在同一行,但用空格分隔,因此您最终会得到上一个要点中的样子。
于 2012-12-11T16:21:34.463 回答
55

不要忘记内置的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)
于 2012-12-11T17:40:24.990 回答
9

您不是在空格上拆分,而是在换行符上拆分。试一试:

IFS=$'
'

var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS
于 2012-12-11T16:22:47.493 回答