如何从Bash中的脚本返回一个数组?

lit*_*way 2 arrays bash

假设我有一个名为'Hello'的脚本.就像是:

array[0]="hello world"
array[1]="goodbye world"
echo ${array[*]}
Run Code Online (Sandbox Code Playgroud)

我想在另一个脚本中做这样的事情:

tmp=(`Hello`)
Run Code Online (Sandbox Code Playgroud)

我需要的结果是:

echo ${tmp[0]}  #prints "hello world"
echo ${tmp[1]}  #prints "goodbye world"
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

echo ${tmp[0]}  #prints "hello"
echo ${tmp[1]}  #prints "world"
Run Code Online (Sandbox Code Playgroud)

换句话说,每个单词都放在tmp数组中的不同位置.我如何得到我需要的结果?

Cha*_*ffy 6

将其作为NUL分隔的流发送:

printf '%s\0' "${array[@]}"
Run Code Online (Sandbox Code Playgroud)

......而在另一方面,从该流中读取:

array=()
while IFS= read -r -d '' entry; do
  array+=( "$entry" )
done
Run Code Online (Sandbox Code Playgroud)

这通常与过程替换一起派上用场; 在下面的示例中,初始代码位于一个命令(无论是函数还是外部进程)中,调用如下generate_an_array:

array=()
while IFS= read -r -d '' entry; do
  array+=( "$entry" )
done < <(generate_an_array)
Run Code Online (Sandbox Code Playgroud)

您还可以使用declare -p发出的字符串eval来获取内容:

array=( "hello world" "goodbye world" )
declare -p array
Run Code Online (Sandbox Code Playgroud)

......而另一方面......

eval "$(generate_an_array)"
Run Code Online (Sandbox Code Playgroud)

然而,这不太可取 - 它不像bash那样可以移植到编程语言(而几乎所有语言都可以读取NUL分隔的流),并且它要求接收程序信任发送程序以返回declare -p结果而不是恶意内容.