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

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

问题原因

  1. 关键函数未被调用:脚本#2中定义了graphic_cards_names函数,但从未在main或脚本其他位置执行该函数,导致循环和curl相关逻辑完全没运行。
  2. 变量赋值逻辑无效:graphic_cards_names里只是用echo输出了变量赋值的字符串(比如rtx3060 = $(curl http://0.0.0.0:5000/rtx3060)),并没有实际执行赋值操作,就算调用了函数,也不会把API返回值存入对应变量。
  3. 变量作用域限制:就算在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:05:34