如何使用另一个命令输出管道来初始化bash数组?

viv*_*an2 32 bash shell

有没有办法管道输出一个列出一堆数字的命令(每个数字在一个单独的行中)并用这些数字初始化一个bash数组?

详细信息:此列表列出了在以下日期范围内提交的3个更改列表编号.然后通过管道输出cut以进一步过滤它以获得更改列表编号.

p4 changes -m 3 -u edk -s submitted @2009/05/01,@now | cut -d ' ' -f 2
Run Code Online (Sandbox Code Playgroud)

例如:

422311
543210
444000
Run Code Online (Sandbox Code Playgroud)

如何将此列表存储在bash数组中?

nik*_*nik 57

您可以在ticks下执行命令并将Array设置为,

ARRAY=(`command`)
Run Code Online (Sandbox Code Playgroud)

或者,您可以将命令的输出保存到文件中并类似地将其保存,

command > file.txt
ARRAY=(`cat file.txt`)
Run Code Online (Sandbox Code Playgroud)

或者,只是下面评论中建议的以下表格之一,

ARRAY=(`< file.txt`)
ARRAY=($(<file.txt))
Run Code Online (Sandbox Code Playgroud)

  • 尽可能避免使用后引号.这更具可读性,可以在没有笨拙引用的情况下使用嵌套:ARRAY =($(command))或ARRAY =($(<file.txt)) (6认同)
  • 无用的cat:`<file.txt`也是如此. (3认同)
  • 如果你的命令输出有空格,那你运气不好 (3认同)
  • 请注意,这将始终使用空格来分隔元素。http://stackoverflow.com/questions/9449417/how-do-i-assign-the-output-of-a-command-into-an-array 报告通过将“IFS”设置为“”\n来处理空格的可能性'` 但我无法让它接受 '\0'`。 (2认同)

And*_*sev 9

如果你使用bash 4+,它有一个特殊的命令:mapfile也称为readarray,所以你可以像这样填充你的数组:

declare -a a
readarray -t a < <(command)
Run Code Online (Sandbox Code Playgroud)

您可以使用更便携的版本

declare -a a
while read i; do
  a=( "${a[@]}" "$i" )
done < <(command)
Run Code Online (Sandbox Code Playgroud)

  • 这是我第一次看到`&lt; &lt;(command)`。您能帮我找到有关此语法的更多详细信息吗?我有兴趣知道为什么它需要 2 个 `&lt;` 才能工作。谢谢 (2认同)
  • 首先 `&lt;` 是输入流的重定向,请参阅 https://www.gnu.org/software/bash/manual/html_node/Redirections.html#Redirecting-Input 以了解拘留。构造 `&lt;(command)` 意味着 `command` 的输出通过管道传送到命名的 fifo(通常是 `/dev/fdn`),你可以在 https://www.gnu.org/software/bash/ 找到它的详细信息手册/html_node/Process-Substitution.html。 (2认同)
  • a [$ {#a [*]}] = value`或`a + =(value)`是附加到数组的更好语法。 (2认同)