You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本存储天气CMD输出的格式问题及优化问询

解决方法

核心问题分析

  1. 变量丢失换行:直接用res=$(CMD)赋值时,Shell会把输出中的换行、制表符等空白字符统一替换成空格,必须用双引号包裹命令替换才能保留原始格式:res="$(CMD)"。输出时也要用echo "$res",否则Shell会再次解析变量内容,把换行当成空格。
  2. while read赋值错误:你应该是循环逻辑写错了——如果循环里只做res=$line,变量只会保留最后一行;如果错误写成res="echo $line",自然会把"echo"存进去。但实际上完全不需要用循环拼接,直接用变量存储完整输出更高效。

最优实现方案

直接在内存中处理所有数据,避免磁盘IO,同时只调用一次API(减少网络请求开销):

#!/bin/bash

# 仅调用一次API,保存原始JSON数据到内存变量
raw_weather=$(curl -s "你的美国天气API地址")

# 格式化输出24小时逐行天气数据,保留换行存入变量
formatted_data="$(echo "$raw_weather" | jq -r '.hourly[] | "\(.datetime) \(.temp)°F \(.weather.description)"' | sed 's/不必要的内容//')"

# 从原始JSON直接提取并计算24小时最低/最高温(比从格式化后提取更高效)
min_temp=$(echo "$raw_weather" | jq -r '[.hourly[].temp] | min')
max_temp=$(echo "$raw_weather" | jq -r '[.hourly[].temp] | max')

# 输出最终结果:格式化数据 + 温极值
echo "$formatted_data"
echo "----------------------------------------"
echo "24小时最低温度: $min_temp°F"
echo "24小时最高温度: $max_temp°F"

关键细节说明

  • 保留换行的正确姿势:命令替换$(...)外面加双引号,能完整保留输出中的换行、空格等格式;输出变量时同样用双引号包裹,避免Shell解析空白字符。
  • 减少重复请求:把原始API响应存到变量,避免多次调用curl,既节省网络资源,又提升脚本速度。
  • 高效计算极值:直接用jq从原始JSON中提取温度数组并计算min/max,比把格式化后的数据再拆分解析要快得多。

替代方案(如果不需要保留原始JSON)

如果只需要格式化后的输出和极值,也可以用管道串联处理,全程内存操作:

#!/bin/bash

# 先输出格式化数据,同时把温度值存入临时数组计算极值
temps=()
echo "$(curl -s "你的API地址" | jq -r '.hourly[] | "\(.datetime) \(.temp)°F \(.weather.description)"' | sed 's/...//')" | tee >(while read -r line; do temps+=("$(echo "$line" | awk '{print $2}' | sed 's/°F//')"); done)

# 计算并输出极值
min_temp=$(printf "%s\n" "${temps[@]}" | sort -n | head -n1)
max_temp=$(printf "%s\n" "${temps[@]}" | sort -n | tail -n1)
echo "----------------------------------------"
echo "24小时最低温度: $min_temp°F"
echo "24小时最高温度: $max_temp°F"

这个方案用tee和进程替换,在输出格式化数据的同时提取温度值,全程不碰磁盘。

内容的提问来源于stack exchange,提问作者Tex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:43:27