BASH中无法将beeline的show partitions命令输出存入数组如何解决
问题原因
你的数组赋值逻辑失败的核心原因是bash内置的read命令默认仅读取输入的第一行内容,遇到换行符就会终止读取操作,因此最终ptns数组中仅存入了首个分区的值。
你尝试切换tsv2格式未生效是因为show partitions的返回结果每行仅包含一个分区值,无论输出格式为csv2还是tsv2,不同分区天然以换行作为分隔符,不会出现制表符。
解决方案
方案1(推荐,适配Bash 4.0及以上版本)
使用专门用于将多行输入读入数组的mapfile(也叫readarray)命令,-t参数会自动去除每行末尾的换行符:
#!/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}" # 直接将多行结果读入数组 mapfile -t ptns <<< "${PARTITIONS}" # 可打印数组长度验证是否读入全部分区 echo "分区总数量: ${#ptns[@]}" for ptn in "${ptns[@]}"; do echo "ptn: ${ptn}" done
方案2(兼容低版本Bash)
给read命令添加-d ''参数,将输入终止符设置为空字符,让read读取到所有内容后再停止:
# 将原数组赋值行替换为以下内容 IFS=$'\n' read -d '' -ra ptns <<< "${PARTITIONS}"
内容的提问来源于stack exchange,提问作者DJFarAway
相关产品推荐
相关产品推荐

