将标准输入读入 bash 数组

PSk*_*cik 7 bash array read

我想完成相当于:

list=()
while read i; do
  list+=("$i")
done <<<"$input"
Run Code Online (Sandbox Code Playgroud)

IFS=$'\n' read -r -a list <<<"$input"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

input=`/bin/ls /`

IFS=$'\n' read -r -a list <<<"$input"

for i in "${list[@]}"; do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

这应该打印 的列表/,但我只得到第一项。

cuo*_*glm 13

您必须使用mapfile(或其同义词readarray,在 中引入bash 4.0):

mapfile -t list <<<"$input"
Run Code Online (Sandbox Code Playgroud)

一次读取调用仅适用于一行,而不适用于整个标准输入。

read -a list将标准第一行的内容填充到数组中list。在您的情况下,您是bin数组`list 中的唯一元素。

  • @cuonglm `IFS` 没用,因为 `mapfile` 不会对其输入进行任何分词。 (2认同)

Ant*_*gan 6

Bash 版本 3(和 4)的解决方案

我碰巧登录了一个运行 Bash 3 的 CentOS 5 机器,我一直在研究解决方案。我已经对 cuonglm 的回答投了赞成票,但我想我也可以发布我想出的解决方案,该解决方案应该适用于 Bash 3(和 4)。我已经用一个文件对其进行了测试,该文件的名称中有一个空格,另一个以-.

代替

IFS=$'\n' read -r -a list <<<"$input"
Run Code Online (Sandbox Code Playgroud)

只需使用命令替换来创建和填充数组:

IFS=$'\n' # split on newline only
set -f    # disable globbing
list=($(printf "%s" "$input"))
Run Code Online (Sandbox Code Playgroud)

注意:这不适用于名称中包含换行符的文件名。


iru*_*var 6

对于bash不支持的版本mapfile

IFS=$'\n' read -ra list -d '' <<< "$input"
Run Code Online (Sandbox Code Playgroud)

应该能解决问题

  • 一个小缺点;该命令将始终具有非零退出状态。 (3认同)
  • 另请注意,它会删除空元素。 (2认同)