运行bash命令并按行拆分输出而不是空格

时间:2017-09-06 18:48:46

标签: bash

我想运行以下命令并获取变量中的输出按行而不是按空格分割:

files=$( hdfs dfs -ls -R $hdfsDir)

所以我得到的输出如下:echo $files

drwxr-xr-x - pepeuser supergroup 0 2016-05-27 15:03 /user/some/kpi/2015/01/02 -rw-r--r-- 3 pepeuser supergroup 55107934 2016-05-27 15:02 /user/some/kpi/2015/01/02/part-00000902148 -rw-r--r-- 3 pepeuser supergroup 49225279 2016-05-27 15:02 /user/some/kpi/2015/01/02/part-00001902148

当我在$ files中执行for而不是在每个文件中获取整行时,我得到的是列而不是行。它打印如下:

drwxr-xr-x
-
pepeuser
supergroup

以及for上需要打印的内容如下:

drwxr-xr-x - pepeuser supergroup 0 2016-05-27 15:03 /user/some/kpi/2015/01/02 
-rw-r--r-- 3 pepeuser supergroup 55107934 2016-05-27 15:02 /user/some/kpi/2015/01/02/part-00000902148 
-rw-r--r-- 3 pepeuser supergroup 49225279 2016-05-27 15:02 /user/some/kpi/2015/01/02/part-00001902148

1 个答案:

答案 0 :(得分:3)

如果您有bash 4,则可以使用readarray

readarray -t files < <(hdfs dfs -ls -R "$hdfsDir")

否则,使用read -a读入数组。 IFS=$'\n'将字段分隔符设置为换行符,-d ''告诉它继续读取直到达到NUL字符:有效,这意味着它将读取到EOF。

IFS=$'\n' read -d '' -r -a files < <(hdfs dfs -ls -R "$hdfsDir")

您可以使用以下内容验证是否正确填充了数组:

printf '[%s]\n' "${files[@]}"

可以使用:

循环遍历数组
for file in "${files[@]}"; do
    echo "$file"
done