我想完成相当于:
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
答案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"))
注意:这不适用于名称中包含换行符的文件名。