Bash循环调用API获取显卡销量数据失败问题排查与解决
问题描述
我需要通过curl从API获取显卡销量数据,第一段脚本(#1)可以正常运行并输出数据;但第二段引入for循环的脚本(#2)无法获取数据,两段逻辑看似相似,但不清楚差异原因。在main函数中调用相关函数后,仅输出echo内容,curl未执行。请求排查问题原因并给出解决方案。
#1 可正常运行的脚本
#!/bin/bash #Récupération des informations de vente des Carte graphiques curl=$(which curl) rtx3060=$(curl http://0.0.0.0:5000/rtx3060) rtx3070=$(curl http://0.0.0.0:5000/rtx3070) rtx3080=$(curl http://0.0.0.0:5000/rtx3080) rtx3090=$(curl http://0.0.0.0:5000/rtx3090) rx6700=$(curl http://0.0.0.0:5000/rx6700) function graphic_card_count() { { echo "$(date)" echo "RTX3060: $rtx3060" echo "RTX3070: $rtx3070" echo "RTX3080: $rtx3080" echo "RTX3090: $rtx3090" echo "RX6700: $rx6700" } } graphic_card_count >> sales.txt
#1 输出示例
Sat Nov 26 15:56:02 UTC 2022 RTX3060: 1 RTX3070: 10 RTX3080: 10 RTX3090: 18 RX6700: 13
#2 无法正常运行的脚本
#!/bin/bash #Retrieval of graphics card sales information graphic_cards=("rtx3060" "rtx3070" "rtx3080" "rtx3090" "rx6700") curl_var="curl http://0.0.0.0:5000/" # a for loop that will iterarte through the 'graphic_cards' # and add the name_card at the end of the curl_var. function graphic_cards_names(){ for name_card in "${graphic_cards[@]}"; do echo "$name_card = \$(${curl_var}${name_card})" done } function main() { echo "$(date)" echo "RTX3060: $rtx3060" echo "RTX3070: $rtx3070" echo "RTX3080: $rtx3080" echo "RTX3090: $rtx3090" echo "RX6700: $rx6700" } main >> sales.txt
问题原因
- 关键函数未被调用:脚本#2中定义了
graphic_cards_names函数,但从未在main或脚本其他位置执行该函数,导致循环和curl相关逻辑完全没运行。 - 变量赋值逻辑无效:
graphic_cards_names里只是用echo输出了变量赋值的字符串(比如rtx3060 = $(curl http://0.0.0.0:5000/rtx3060)),并没有实际执行赋值操作,就算调用了函数,也不会把API返回值存入对应变量。 - 变量作用域限制:就算在
graphic_cards_names里正确赋值,默认情况下函数内的变量是局部的,main函数无法访问这些变量。
解决方案
修复后的脚本需要实现:调用数据获取函数、正确执行变量赋值、确保变量能被main访问。以下是两种可行方案:
方案1:用关联数组存储数据(更安全规范)
#!/bin/bash #Retrieval of graphics card sales information graphic_cards=("rtx3060" "rtx3070" "rtx3080" "rtx3090" "rx6700") api_base_url="http://0.0.0.0:5000/" # 定义关联数组存储销量数据 declare -A sales_data function fetch_sales_data() { for name_card in "${graphic_cards[@]}"; do # 实际执行curl并将结果存入关联数组 sales_data[$name_card]=$(curl "${api_base_url}${name_card}") done } function main() { # 先调用数据获取函数 fetch_sales_data echo "$(date)" echo "RTX3060: ${sales_data[rtx3060]}" echo "RTX3070: ${sales_data[rtx3070]}" echo "RTX3080: ${sales_data[rtx3080]}" echo "RTX3090: ${sales_data[rtx3090]}" echo "RX6700: ${sales_data[rx6700]}" } main >> sales.txt
方案2:动态赋值全局变量(适配原有变量名)
#!/bin/bash #Retrieval of graphics card sales information graphic_cards=("rtx3060" "rtx3070" "rtx3080" "rtx3090" "rx6700") api_base_url="http://0.0.0.0:5000/" function fetch_sales_data() { for name_card in "${graphic_cards[@]}"; do # 使用eval执行变量赋值,将结果存入全局变量 eval "${name_card}=$(curl "${api_base_url}${name_card}")" done } function main() { fetch_sales_data echo "$(date)" echo "RTX3060: $rtx3060" echo "RTX3070: $rtx3070" echo "RTX3080: $rtx3080" echo "RTX3090: $rtx3090" echo "RX6700: $rx6700" } main >> sales.txt
内容的提问来源于stack exchange,提问作者Raouf Yahiaoui
相关产品推荐
相关产品推荐

