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
相关产品推荐
相关产品推荐

