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

如何在Bash脚本中实现MySQL状态数据的条件化增删改操作?

在Bash脚本中实现MySQL状态数据的条件增删改操作

一、优化你的插入脚本(避免重复+提升效率)

你提供的插入脚本存在重复插入IP、循环内重复连接数据库等问题,以下是优化后的版本,同时加入避免重复插入的条件逻辑:

#!/bin/bash

# 数据库配置
DB_USER='root'
DB_PASSWD=''
DB_NAME='iplist'
TABLE='iplist'

# 下载Arvancloud IP列表
echo "Downloading Arvancloud IPs list..."
rm -f ip.txt
curl https://www.arvancloud.ir/fa/ips.txt >> ip.txt

# 获取当前完整时间(适配MySQL datetime类型)
current_datetime=$(date +"%Y-%m-%d %H:%M:%S")
status="up"

# 批量处理IP,一次性连接数据库执行所有操作
mysql --user=$DB_USER --password=$DB_PASSWD $DB_NAME << EOF
$(while read -r IPLIST; do
  # 跳过空行
  [[ -z "$IPLIST" ]] && continue
  # 带条件插入:IP存在则更新状态和时间,不存在则插入
  echo "INSERT INTO $TABLE (\`IPLIST\`, \`status\`, \`DATE\`) VALUES ('$IPLIST', '$status', '$current_datetime') 
        ON DUPLICATE KEY UPDATE \`status\` = '$status', \`DATE\` = '$current_datetime';"
done < ip.txt)
EOF

echo "IP status data synced successfully."

关键优化说明:

  • 避免重复插入:使用ON DUPLICATE KEY UPDATE,需要先给IPLIST字段设置唯一索引(执行SQL:ALTER TABLE iplist ADD UNIQUE INDEX idx_ip (IPLIST);)
  • 提升效率:仅建立一次MySQL连接,批量执行所有SQL语句
  • 鲁棒性:用read -r读取IP,避免特殊字符解析问题;跳过空行

二、带条件的更新操作

1. 更新指定IP的状态

target_ip="185.143.232.0"
new_status="down"
update_datetime=$(date +"%Y-%m-%d %H:%M:%S")

mysql --user=$DB_USER --password=$DB_PASSWD $DB_NAME << EOF
UPDATE $TABLE 
SET \`status\` = '$new_status', \`DATE\` = '$update_datetime' 
WHERE \`IPLIST\` = '$target_ip';
EOF

2. 批量更新超时IP的状态

比如将3小时未更新的IP状态改为unknown:

update_datetime=$(date +"%Y-%m-%d %H:%M:%S")
three_hours_ago=$(date -d "-3 hours" +"%Y-%m-%d %H:%M:%S")

mysql --user=$DB_USER --password=$DB_PASSWD $DB_NAME << EOF
UPDATE $TABLE 
SET \`status\` = 'unknown', \`DATE\` = '$update_datetime' 
WHERE \`DATE\` < '$three_hours_ago';
EOF

三、带条件的删除操作

1. 删除指定状态的IP

比如删除所有状态为down的IP:

mysql --user=$DB_USER --password=$DB_PASSWD $DB_NAME << EOF
DELETE FROM $TABLE WHERE \`status\` = 'down';
EOF

2. 删除超时的历史数据

比如删除24小时前的状态数据:

twentyfour_hours_ago=$(date -d "-24 hours" +"%Y-%m-%d %H:%M:%S")

mysql --user=$DB_USER --password=$DB_PASSWD $DB_NAME << EOF
DELETE FROM $TABLE WHERE \`DATE\` < '$twentyfour_hours_ago';
EOF

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:01:23