Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 命令输出到阵列不工作_Shell_Ksh - Fatal编程技术网

Shell 命令输出到阵列不工作

Shell 命令输出到阵列不工作,shell,ksh,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) 问题是,我的数组只从每个结果

我试图将一系列直线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)
问题是,我的数组只从每个结果中获取最后一行(选择了15行(0.187秒)


我在这里做错了什么吗?完全相同的方法也适用于其他情况,所以我真的不明白。

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

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

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

# modified/wrong code
ext_output=+( "$line" )
请注意加号(
+
)的位置:

  • 当位于等号(
    +=
    )的左侧时,每个$行将附加到数组的末尾(请参见下面的示例运行)
  • 当位于等号(
    =+
    )右侧时,每个$行被分配给数组中的第一个插槽(索引=0);加号(
    +
    )和参数(
    ()
    )被视为要存储在数组中的数据的一部分(请参阅本文底部的示例运行)
您正在运行的内容(结果“错误”)与您在本帖中发布的内容(以及您提到的内容在其他情况下生成正确的结果)之间是否存在打字错误


下面是我运行您发布的代码时得到的结果(等号左边的加号:
+=

注意:我已将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)
…阵列统计信息:

$ 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) )
…以及数组的内容:

$ 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 : +(     15 rows selected (0.187 seconds) )

!!请注意,加号和括号是存储在
ext\u output[0]
Hmmmm中的字符串的一部分,我对您发布的代码没有任何问题

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

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

# modified/wrong code
ext_output=+( "$line" )
请注意加号(
+
)的位置:

  • 当位于等号(
    +=
    )的左侧时,每个$行将附加到数组的末尾(请参见下面的示例运行)
  • 当位于等号(
    =+
    )右侧时,每个$行被分配给数组中的第一个插槽(索引=0);加号(
    +
    )和参数(
    ()
    )被视为要存储在数组中的数据的一部分(请参阅本文底部的示例运行)
您正在运行的内容(结果“错误”)与您在本帖中发布的内容(以及您提到的内容在其他情况下生成正确的结果)之间是否存在打字错误


下面是我运行您发布的代码时得到的结果(等号左边的加号:
+=

注意:我已将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)
…阵列统计信息:

$ 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) )
…以及数组的内容:

$ 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 : +(     15 rows selected (0.187 seconds) )

!!请注意,加号和括号是存储在
ext\u输出[0]中的字符串的一部分

感谢您提供的大量信息和解释。我发现,令我非常尴尬的是,我的代码实际上在工作。选择的
15行…
位是从
done>返回的。感谢您提供的大量信息和解释。我发现,令我非常尴尬的是,我的代码实际上在工作。
15所选行…
位正从
完成返回<