【问题标题】:Can't put output of beeline "show partitions" command into array in BASH无法将直线“显示分区”命令的输出放入 BASH 中的数组中
【发布时间】:2021-10-25 21:24:40
【问题描述】:

在我的 bash 脚本中,我想使用 beeline 发出“显示分区”命令,然后遍历作为该命令输出的分区。该命令工作正常,但我不知道如何迭代迭代。这是我的代码:

#!/usr/bin/env bash
PARTITIONS=$(/usr/bin/beeline -u "$hive_llap" --showHeader=false --outputformat=csv2 -e "use my_db; show partitions my_hist_table;")
echo -e "PARTITIONS: ${PARTITIONS}"
IFS=$'\n' read -ra ptns <<< "${PARTITIONS}"
echo "ptns: ${ptns}"
for ptn in "${ptns[@]}"; do
        echo "ptn: ${ptn}"
done

这是输出:

PARTITIONS: yr=2021/mo=08
yr=2021/mo=2
yr=2021/mo=4
ptns: yr=2021/mo=08
ptn: yr=2021/mo=08

似乎输出正确地进入了 $PARTITIONS,但是我尝试将其放入数组 ptns 中的尝试不起作用。我曾尝试在 IFS 语句中使用 outputformat=tsv2 和 \t,但我得到了同样的结果,即 $PARTITIONS 显示的内容显然是换行符(不是制表符,即使在使用 tsv2 时也是如此)。

【问题讨论】:

  • @markp-fuso 第一个建议成功了,谢谢!如果你想创建一个答案,我会检查它是否已接受

标签: bash beeline ifs


【解决方案1】:

考虑更换:

IFS=$'\n' read -ra ptns <<< "${PARTITIONS}"

与:

read -d' ' -ra ptns <<< "${PARTITIONS}"

应该生成:

$ typeset -p ptns
declare -a ptns=([0]="yr=2021/mo=08" [1]="yr=2021/mo=2" [2]="yr=2021/mo=4")

另一种选择,尤其是${PARTITIONS} 中的每一行都可能包含空格时:

$ mapfile -t ptns <<< "${PARTITIONS}"
$ typeset -p ptns
declare -a ptns=([0]="yr=2021/mo=08" [1]="yr=2021/mo=2" [2]="yr=2021/mo=4")

【讨论】:

    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2017-11-28
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多