如何在Hive导出的CSV文件名中加入Shell动态季度变量
解决Bash脚本中动态季度变量导致CSV文件名含隐藏换行符的问题
问题场景
编写了一个每季度自动执行的Bash脚本,目标是将Hive查询结果导出到CSV文件,并在文件名中加入动态计算的季度变量。但发现只要文件名中加入$qtr变量,生成的CSV就无法正常读取;去掉变量则一切正常。
原脚本片段:
#!/bin/bash qtr=$(date -d "-2 month" +%Y)Q$(( ($(date -d "-2 month" +%-m)-1)/3+1 )) hiveconnector -e "set hive.cli.print.header=true;select * from hivetable;" | tr "\t" "," >file_name_$qtr.csv
排查过程
尝试过多种变量引用写法,包括:
file_name_${qtr}.csv, file_name"${qtr}".csv, $"file_name_${qtr}.csv"
均未解决问题。后来从错误信息中发现关键线索:
Can't create file 'C:...\file_name_2024Q1
.csv'
The filename, directory name, or volume label syntax is incorrect.
可见$qtr变量和.csv后缀之间被插入了隐藏的换行符,即使使用echo输出变量时无法直接看到这个换行符。
解决方案
通过清理变量中的换行符,并使用单独变量存储完整文件名/路径解决问题:
- 先对季度变量进行换行符清理,移除可能存在的
\r或\n:
qtr=$(date -d "-2 month" +%Y)Q$(( ($(date -d "-2 month" +%-m)-1)/3+1 )) qtr=$(echo "$qtr" | tr -d '\r\n')
- 使用新变量存储完整的输出文件名,避免直接拼接时的隐藏字符问题:
output_file="file_name_${qtr}.csv" hiveconnector -e "set hive.cli.print.header=true;select * from hivetable;" | tr "\t" "," >"$output_file"
这样生成的文件名就不会包含隐藏换行符,CSV文件可以正常读取。
内容的提问来源于stack exchange,提问作者jess
相关产品推荐
相关产品推荐

