Bash脚本输出气压与日期间出现换行的原因排查
问题描述
编写了一个小型Bash脚本,从指定网站获取当前气压并存入变量,希望在气压后添加当前日期并写入类CSV文件。但气压与日期间始终存在换行,尝试用sed或tr '\n'去除换行无效;怀疑wget执行过晚导致echo提前执行,添加&&连接所有命令后问题依旧。使用Linux系统,请问思路哪里出错了?
PS:首次尝试使用sed,写法肯定可以优化;)
原始脚本:
#!/bin/bash luftdruck=$(wget 'https://www.fg-wetter.de/aktuelle-messwerte/' -O aktuell.html && cat aktuell.html | grep -A 0 hPa | sed -e 's/<[^>]*>//g' | sed -e '/^-/d' | sed -e '/title/d' | sed -e 's/ hPa//g') datum=$(date) echo -e "${luftdruck} ${datum}" >> ausgabe.txt
问题分析与解决
核心问题
不是wget执行时机的问题,而是luftdruck变量本身包含多余换行符。你的提取逻辑通过grep和sed处理后,输出的内容不止一行(可能包含空行或无关文本行),导致变量里自带换行,echo时自然会在气压和日期之间换行。
优化方案
简化提取逻辑,确保只获取单行的气压数值,同时合并冗余的sed命令,提升效率:
优化后的脚本
#!/bin/bash # 直接下载页面内容并提取气压数值,避免临时文件 luftdruck=$(wget -qO- 'https://www.fg-wetter.de/aktuelle-messwerte/' | grep -oP '\d+(?= hPa)' | head -n1) # 可指定日期格式,让CSV更规范,比如:datum=$(date +"%Y-%m-%d %H:%M:%S") datum=$(date) # 用逗号分隔符合CSV格式,避免空格干扰 echo "${luftdruck},${datum}" >> ausgabe.txt
关键改进点
wget -qO-:静默模式(-q)直接将页面内容输出到标准输出(-O-),省去临时文件和cat的多余步骤。- 精准匹配气压值:用
grep -oP '\d+(?= hPa)'通过Perl正则只提取hPa前的数字,避免提取到无关HTML文本或换行。 head -n1:确保只取第一行匹配结果,彻底避免变量混入多行内容。- CSV格式规范:用逗号分隔气压和日期,符合类CSV文件的格式要求,同时避免空格带来的潜在问题。
- 去掉
echo -e:无需转义字符,避免意外解析变量中的特殊字符。
额外建议
- 若网站HTML结构发生变化,正则表达式可能失效,需要重新调整匹配规则。
- 可替换wget为curl:
curl -s 'https://www.fg-wetter.de/aktuelle-messwerte/',效果一致。 - 给
date指定明确格式(如date +"%Y-%m-%d %H:%M:%S"),让CSV中的日期更统一易读。
内容的提问来源于stack exchange,提问作者SPagesDE
相关产品推荐
相关产品推荐

