将 stdin 读入 bash 数组

将 stdin 读入 bash 数组

我想完成相当于:

list=()
while read i; do
  list+=("$i")
done <<<"$input"

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

我究竟做错了什么?

input=`/bin/ls /`

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

for i in "${list[@]}"; do
  echo "$i"
done

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

答案1

你必须使用地图文件(或其同义词读取数组,在 ) 中介绍bash 4.0

mapfile -t list <<<"$input"

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

read -a list将标准第一行的内容填充到数组中list。在你的例子中,你得到了bin数组“list”中的唯一元素。

答案2

对于bash不支持的版本mapfile

IFS=$'\n' read -ra list -d '' <<< "$input"

应该能解决问题

答案3

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

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

代替

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

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

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

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

相关内容