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

Bash脚本循环执行MySQL查询仅返回单条记录问题排查

问题原因

脚本逻辑异常是三个核心写法错误导致的:

  • 循环内每次给data_l赋值都是全量覆盖,第二次循环的查询结果会直接替换第一次的内容,不会保留历史查询值
  • MySQL客户端默认输出会携带列名行,且你将echo语句写在了循环外部,本身就只能输出循环执行完成后最后一次赋值的内容,无法拿到所有循环的查询结果
  • 原SQL语句在FROM关键字后手动换行,部分环境下会出现SQL拼接异常,导致后续循环查询执行失败
修复方案

直接使用修正后的脚本即可,改动点包括给MySQL客户端加静默参数跳过列名输出、循环内追加存储查询结果、修正SQL换行问题:

data_path="https://localhost/public/"
data_name=(PXL_20220628_152928222.mp4 PXL_20220628_163301667.mp4)
data_l=""
for q in "${data_name[@]}";
do
    full_url="${data_path}${q}"
    # -N 跳过列名输出,-B 开启静默模式取消格式化多余内容
    res=$(sudo mysql -N -B -h localhost -P 3306 -u ck****** -p"*******" -e "SELECT iddata FROM ck*****.data WHERE links = '${full_url}'")
    # 追加结果到总变量,用换行分隔多条记录
    data_l+="${res}"$'\n'
done
echo "$data_l"

如果不需要把结果存到变量里做后续处理,可以直接在循环内输出查询结果,逻辑更简单:

data_path="https://localhost/public/"
data_name=(PXL_20220628_152928222.mp4 PXL_20220628_163301667.mp4)
for q in "${data_name[@]}";
do
    sudo mysql -N -B -h localhost -P 3306 -u ck****** -p"*******" -e "SELECT iddata FROM ck*****.data WHERE links = '${data_path}${q}'"
done
优化建议
  • 不要将数据库明文密码硬编码在脚本中,可以配置MySQL客户端的my.cnf文件存储鉴权信息,避免密码泄露
  • 批量查询场景下不需要循环发起多次请求,可以拼接WHERE links IN ('url1', 'url2')格式的单条SQL一次性查询所有结果,执行效率更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:57:20