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

Shell脚本中如何使用变量名而非变量值作为文件名?

解决方法

你第二个循环的问题很明确:遍历的是tromso、gjovik这些变量的值(比如lat=69.6492&lon=18.9553),不是变量名本身,所以${CITY}.txt会生成一堆以经纬度字符串命名的文件,完全不符合预期。

给你两种可行的修改方案:

方案一:间接引用变量值(兼容所有Bash版本)

直接把第二个循环改成和第一个循环一样遍历变量名,用Shell的${!变量名}语法(间接引用)来获取对应变量的经纬度值,这样就能用城市名作为文件名:

# 城市经纬度配置
tromso="lat=69.6492&lon=18.9553"
gjovik="lat=60.8941&lon=10.5001"
oslo="lat=59.9139&lon=10.7522"
trondheim="lat=63.4305&lon=10.39.51"
bergen="lat=60.3913&lon=5.3221"
echo "a"

# 创建存储目录(需要时取消注释)
#mkdir scraped-weather

# 初始化城市文件,写入城市名
for CITY  in tromso gjovik oslo trondheim bergen; do
         echo ${CITY} > ${CITY}.txt
done
echo "b"

# 获取天气数据并写入对应城市文件
for CITY in tromso gjovik oslo trondheim bergen; do
         # 用${!CITY}拿到当前城市的经纬度参数
         curl -s "$API${!CITY}"  |  grep -A5 -E '[0-9]{2}-[0-9]{2}-[0-9]{2}'  >> ${CITY}.txt 
done

方案二:用关联数组(Bash 4.0+推荐)

如果你的Bash版本是4.0及以上,用关联数组把城市名和经纬度绑定,代码更简洁清晰,还能把两个循环合并成一个:

#!/bin/bash

# 关联数组:键是城市名,值是经纬度参数
declare -A cities=(
    [tromso]="lat=69.6492&lon=18.9553"
    [gjovik]="lat=60.8941&lon=10.5001"
    [oslo]="lat=59.9139&lon=10.7522"
    [trondheim]="lat=63.4305&lon=10.39.51"
    [bergen]="lat=60.3913&lon=5.3221"
)

echo "a"

# 创建存储目录(需要时取消注释)
#mkdir scraped-weather

# 遍历所有城市名,同时完成初始化和数据写入
for CITY in "${!cities[@]}"; do
    echo ${CITY} > ${CITY}.txt
    curl -s "$API${cities[$CITY]}" | grep -A5 -E '[0-9]{2}-[0-9]{2}-[0-9]{2}' >> ${CITY}.txt
done

echo "b"

这样修改后,脚本会生成tromso.txt、gjovik.txt等以城市名命名的文件,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:45:32