我想完成相当于:
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 中的唯一元素。
我碰巧登录了一个运行 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)
注意:这不适用于名称中包含换行符的文件名。
对于bash不支持的版本mapfile
IFS=$'\n' read -ra list -d '' <<< "$input"
Run Code Online (Sandbox Code Playgroud)
应该能解决问题
| 归档时间: |
|
| 查看次数: |
11560 次 |
| 最近记录: |