将命令输出到数组不起作用

时间:2017-07-07 21:16:31

标签: shell ksh

我正在尝试将一系列直线HQL查询的输出存储到一个数组中,以便我可以解析它以提取有趣的位。这是相关的代码:

    #!/usr/bin/env ksh
    ext_output=()
    while IFS= read -r line; do
      ext_output+=( "$line" )
    done < <( bee  --hiveconf hive.auto.convert.join=false  -f temp.hql)

bee只是使用JDBC url等完整beeline命令的别名.Temp.hql是多个hql查询。

以下是每个查询输出结果的片段:

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+
    | tableName:myTable                                                                                                                                                                                                                                                                                                                                                                                                   |
    | owner:foo                                                                                                                                                                                                                                                                                                                                                                                                        |
    | location:hdfs://<server>/<path>...
<big snip>
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+
    15 rows selected (0.187 seconds)

问题是,我的数组只从每个结果中获取最后一行(选择了15行(0.187秒)。

我在这里做错了吗?完全相同的方法在其他情况下有效,所以我真的不明白。

1 个答案:

答案 0 :(得分:2)

嗯,我对您发布的代码没有任何问题。

如果我在代码中进行以下更改,可以重现我认为您可能会看到的内容(即数组包含由输出的最后一行组成的单个值):

# current/correct code - from your post
ext_output+=( "$line" )

# modified/wrong code
ext_output=+( "$line" )

注意加号(+)的位置:

  • 当在等号(+=)的左侧时,每个$行都附加到数组的末尾(参见下面的示例运行)
  • 当在等号(=+)的右侧时,每个$行被分配给数组中的第一个槽(index = 0);加号(+)和parens(())被视为要存储在数组中的数据的一部分(参见本文底部的示例运行)

在您正在投放的内容(以及错误的&#39;结果)与您在此帖子中发布的内容之间是否存在拼写错误(以及您提到的内容会产生的错误)其他情况下的正确结果)?

以下是我运行您发布的代码时获得的结果(等号左侧的加号:+=)...

注意:我已经用包含您的采样线和一对(伪造)数据线的输出文件替换了bee / HCL调用;为了便于阅读,还缩短了较长的行:

$ cat temp.out
    -----------------------------------------+--+
    | tableName:myTable
    | owner:foo
    | location:hdfs://<server>/<path>...

abc def ghi
123 456 789

    -----------------------------------------+--+
    15 rows selected (0.187 seconds)

然后我针对temp.out运行你的代码:

ext_output=()

while IFS= read -r line
do
    ext_output+=( "$line" )
done < temp.out

阵列上的一些统计数据:

$ echo "array size : ${#ext_output[*]}"
array size : 10

$ echo "array indx : ${!ext_output[*]}"
array indx : 0 1 2 3 4 5 6 7 8 9

$ echo "array vals : ${ext_output[*]}"
array vals :     -----------------------------------------+--+     | tableName:myTable                              | owner:foo                                      | location:hdfs://<server>/<path>...  abc def ghi 123 456 789      -----------------------------------------+--+     15 rows selected (0.187 seconds)

转储数组的内容:

$ for i in ${!ext_output[*]}
> do
> echo "${i} : ${ext_output[$i]}"
> done
0 :     -----------------------------------------+--+
1 :     | tableName:myTable
2 :     | owner:foo
3 :     | location:hdfs://<server>/<path>...
4 :
5 : abc def ghi
6 : 123 456 789
7 :
8 :     -----------------------------------------+--+
9 :     15 rows selected (0.187 seconds)

如果我修改您的代码,将加号放在等号(=+)的右侧......

ext_output=()

while IFS= read -r line
do
    ext_output=+( "$line" )
done < temp.out

......数组统计信息:

$ echo "array size : ${#ext_output[*]}"
array size : 1

$ echo "array indx : ${!ext_output[*]}"
array indx : 0

$ echo "array vals : ${ext_output[*]}"
array vals : +(     15 rows selected (0.187 seconds) )

......以及数组的内容:

$ for i in ${!ext_output[*]}
> do
> echo "${i} : ${ext_output[$i]}"
> done
0 : +(     15 rows selected (0.187 seconds) )

!!请注意,加号和parens是ext_output[0]

中存储的字符串的一部分