在 Bash 中读取带有前置或附加值的数组

Readarray with preppended or appended values in Bash

在 Bash 中,如果我想获取所有可用键盘布局的列表,但在前面加上我自己的键盘布局,我可以这样做:

readarray -t layouts < <(localectl list-x11-keymap-layouts)
layouts=("custom1" "custom2" "${kb_layouts[@]}")

如果我想追加我可以这样做:

readarray -t layouts < <(localectl list-x11-keymap-layouts)
layouts=("${kb_layouts[@]}" "custom1" "custom2")

是否可以在 readarray 命令中在一行中实现相同的功能?

由于进程替换输出 <(..) 被进程使用的 FIFO 替换,您可以在其中添加更多选择命令。例如。要追加 "custom1" "custom2" 你只需要做

readarray -t layouts < <(
  localectl list-x11-keymap-layouts; 
  printf '%s\n' "custom1" "custom2" )

这将创建一个 FIFO,其中包含来自 localectl 输出和 printf 输出的内容,以便 readarray 可以将它们作为另一个唯一的非空行读取。对于前置操作,与 printf 输出相同,后跟 localectl 输出。

您可以使用 -O 选项到 mapfile/readarray 来指定起始索引。所以

declare -a layouts=(custom1 custom2)
readarray -t -O"${#layouts[@]}" layouts < <(localectl list-x11-keymap-layouts)

将在数组中现有值之后开始添加命令行,而不是覆盖现有内容。

您可以使用 +=(...):

一次将多个值附加到现有数组
readarray -t layouts < <(localectl list-x11-keymap-layouts)
layouts+=(custom1 custom2)