在脚本中使用echo命令获取字段时,打印后字符串错位了。
脚本大致如下:
#!/bin/bash
source /etc/profile
export LANG=en_US.UTF-8now_date=`date +"%Y-%m-%d %H:%M"`
files=`cat ***Path.txt`
now_day=`date +"%Y-%m-%d"`separator=`echo -e '\u0001'`
for file in $files
do {
business_name=`echo $file | awk -F '|' '{print $2}'`
vendor_name=`echo $file | awk -F '|' '{print $1}'`
vendor_lead=`echo $file | awk -F '|' '{print $3}'`
vendor_phone=`echo $file | awk -F '|' '{print $4}'`
authority_lead=`echo $file | awk -F '|' '{print $5}'`
authority_lead_dept=`echo $file | awk -F '|' '{print $6}'`
authority_lead_phone=`echo $file | awk -F '|' '{print $7}'`
alarm_ip="*****"
alarm_time=$now_date
alarm_phone="*****"
Path=`echo $file | awk -F '|' '{print $12}'`
# PathName=`echo $(basename $Path)`
PathName=`echo $file | awk -F '|' '{print $13}'`
num=`hdfs dfs -ls $Path | grep ".log" | wc -l`
num2=`hdfs dfs -ls $Path/.hoodie | grep "$now_day" | grep "rollback" | wc -l`
#sleep 5s#if [ $num -gt 240 ] || [ $num2 -gt 15 ] ; then
# echo $business_name$separator$vendor_name$separator$vendor_lead$separator$vendor_phone$separator$authority_lead$separator$authority_lead_dept$separator$alarm_ip$separator$alarm_time$separator$alarm_phone$separator$business_name"|"$PathName"|"$num"|"$num2
echo $business_name","$vendor_name","$vendor_lead","$vendor_phone","$authority_lead","$authority_lead_dept","$alarm_ip","$alarm_time","$alarm_phone","$business_name"|,"$PathName"|"$num""$num2#fi
}&
done
打印的结果,顺序是错乱的 ,数字跑去了最前面
经过测试,发现获取到的返回值是没问题的,但可能带了某些不可见的字符。
看到了这篇文章,一个shell中诡异问题的解决-腾讯云开发者社区-腾讯云,提到可以在末尾加一个过滤,变成
num=`echo $file | awk -F '|' '{print $4} | tr -d '\r'`
echo $num
就达到了删除\r,保证对的换行,
#!/bin/bash
source /etc/profile
export LANG=en_US.UTF-8now_date=`date +"%Y-%m-%d %H:%M"`
files=`cat /*/Path.txt`
now_day=`date +"%Y-%m-%d"`separator=`echo -e '\u0001'`for file in $files
do {business_name=`echo $file | awk -F '|' '{print $2}' | tr -d '\r' `vendor_name=`echo $file | awk -F '|' '{print $1}' | tr -d '\r'`vendor_lead=`echo $file | awk -F '|' '{print $3}' | tr -d '\r'`vendor_phone=`echo $file | awk -F '|' '{print $4}' | tr -d '\r'`authority_lead=`echo $file | awk -F '|' '{print $5}' | tr -d '\r'`authority_lead_dept=`echo $file | awk -F '|' '{print $6}' | tr -d '\r'`authority_lead_phone=`echo $file | awk -F '|' '{print $7}' | tr -d '\r'`alarm_ip="**"alarm_time=$now_datealarm_phone="**"Path=`echo $file | awk -F '|' '{print $12}' | tr -d '\r' `# PathName=`echo $(basename $Path)`PathName=`echo $file | awk -F '|' '{print $13}' | tr -d '\r' `num=`hdfs dfs -ls $Path | grep ".log" | wc -l | tr -d '\r'` num2=`hdfs dfs -ls $Path/.hoodie | grep "$now_day" | grep "rollback" | wc -l | tr -d '\r'`if [ $num -gt 240 ] || [ $num2 -gt 15 ] ; thenecho $business_name","$vendor_name","$vendor_lead","$vendor_phone","$authority_lead","$authority_lead_dept","$alarm_ip","$alarm_time","$alarm_phone","$business_name"|表名:"$PathName"|文件数量:"$num"回滚数量:"$num2fi
}&
done
原因:
Unix系统里,每行结尾只有“<换行>”,即“\n”,Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”,Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行,而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
因此,\r就是return回到本行行首,这就会把这一行以前的输出覆盖掉。