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

MySQL输出重定向仅生成空行,求排查Bash脚本问题

问题:Bash脚本读取CSV执行MySQL查询后输出文件仅为空行

我从前任管理员处继承了一个读取CSV文件的Bash脚本,现在修改它让输出和错误信息写入文本文件,但得到的输出文件只有空行,想请教原因。

脚本代码如下:

#!/bin/bash

while read line; do

configname=$(echo "$line" | cut -d, -f1)
servicename=$(echo "$line" | cut -d, -f2)
oldcommand=$(echo "$line" | cut -d, -f3)
newcommand=$(echo "$line" | cut -d, -f4)

part1=$(echo -e "SELECT config_name,service_description,check_command FROM tbl_service")
part2=$(echo -e "WHERE config_name='$configname' and check_command='$newcommand' and service_description='$servicename'")

sqlquery=$(echo -e "$part1 $part2")

echo "$sqlquery"

output=$(echo "$sqlquery;" | mysql --host=localhost --user=sqluser --password='sqlpwd' sqldb1)
echo "$output" > Output.log 2> Error.log


done < "$1"

解决方法

1. 日志被循环覆盖

脚本每次循环都用>重定向输出到Output.log、2>重定向错误到Error.log,这会直接覆盖之前的文件内容,最终文件里只会保留最后一次循环的结果。如果最后一次查询没有返回数据,文件就会是空行。

解决:把重定向改成追加模式>>,同时将mysql的错误输出单独追加到错误日志:

# 捕获mysql执行错误并追加到Error.log
output=$(echo "$sqlquery;" | mysql --host=localhost --user=sqluser --password='sqlpwd' sqldb1 2>> Error.log)
# 查询结果追加到Output.log
echo "$output" >> Output.log

2. CSV字段分割方式低效且易出错

用echo + cut分割CSV字段的方式不仅低效,还可能在字段包含空格、特殊字符时解析错误,导致变量值不正确,最终SQL查询无结果。

解决:直接用read命令结合IFS指定分隔符,高效分割字段:

# IFS=, 指定逗号为分隔符,-r 避免转义字符被错误解析
while IFS=, read -r configname servicename oldcommand newcommand; do
    # 后续逻辑直接使用这四个变量,无需cut命令
    part1="SELECT config_name,service_description,check_command FROM tbl_service"
    part2="WHERE config_name='$configname' and check_command='$newcommand' and service_description='$servicename'"
    sqlquery="$part1 $part2"
    # ... 其余执行逻辑
done < "$1"

3. SQL语法错误(变量含特殊字符)

如果CSV中的字段包含单引号(比如O'Neil),直接拼入SQL会导致语法错误,mysql执行失败后返回空输出。

解决:转义变量中的单引号(MySQL用两个单引号转义单个单引号):

# 转义变量里的单引号
configname_escaped=$(echo "$configname" | sed "s/'/''/g")
servicename_escaped=$(echo "$servicename" | sed "s/'/''/g")
newcommand_escaped=$(echo "$newcommand" | sed "s/'/''/g")

# 使用转义后的变量拼接SQL
part2="WHERE config_name='$configname_escaped' and check_command='$newcommand_escaped' and service_description='$servicename_escaped'"

4. 调试建议

在循环中加入查询日志,方便排查每次执行的SQL是否正确:

echo "[$(date)] 执行SQL: $sqlquery" >> Query.log

通过这个日志可以直观看到每次的SQL语句,判断是查询无结果还是语法错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:52:25