Shell 命令输出到阵列不工作
我试图将一系列直线HQL查询的输出存储到一个数组中,以便对其进行解析以提取出感兴趣的位。以下是相关代码: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) 问题是,我的数组只从每个结果
#!/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所选行…
位正从完成返回<