Bash脚本调用MySQL查询IP时$1参数无法填充的语法问题
解决Bash脚本中MySQL查询的参数替换问题
看起来你遇到的问题是Bash单引号阻止了变量展开,加上SQL语法的小疏漏,导致查询失败。咱们一步步拆解解决:
问题根源
你原来的命令用单引号包裹了整个SQL语句:
mysql -Ns wksips -e 'SELECT IP FROM ips WHERE ID LIKE %$1'
在Bash里,单引号内部的所有内容都会被当作纯字面量,$1根本不会被替换成你传入的2010。MySQL收到的查询语句是SELECT IP FROM ips WHERE ID LIKE %$1——这显然不符合SQL语法:LIKE的匹配模式必须用引号括起来,而且%$1本身也是无效的表达式。
正确的写法
结合你的需求(设备ID以wks开头,比如wks2010,传入参数是后缀2010),这里有两种可靠的实现方式:
写法1:用双引号包裹整个SQL语句
双引号允许Bash解析内部的变量,同时记得给SQL里的匹配模式加上单引号:
mysql -Ns wksips -e "SELECT IP FROM ips WHERE ID LIKE 'wks$1'"
Bash会先把$1替换成2010,最终传给MySQL的查询是:
SELECT IP FROM ips WHERE ID LIKE 'wks2010'
如果你的需求是匹配以wks开头且包含传入参数的ID(比如wks2010abc),可以把模式改成'wks%$1%'。
写法2:单双引号拼接(更安全的变量隔离)
如果担心双引号内的其他字符被Bash意外解析,可以把固定SQL字符串用单引号,变量部分用双引号拼接:
mysql -Ns wksips -e 'SELECT IP FROM ips WHERE ID LIKE "wks'"$1"'"'
这里的拼接逻辑是:'SELECT ... LIKE "wks' + "$1" + "'",最终同样会生成正确的SQL语句。
完整健壮的脚本示例
为了避免没传参数时出错,建议加上参数检查:
#!/bin/bash # 检查是否传入了合法参数 if [ $# -ne 1 ]; then echo "用法: $0 <设备ID后缀>" echo "示例: $0 2010" exit 1 fi # 执行查询并获取IP device_ip=$(mysql -Ns wksips -e "SELECT IP FROM ips WHERE ID LIKE 'wks$1'") # 输出结果 if [ -n "$device_ip" ]; then echo "设备wks$1的IP地址: $device_ip" else echo "未找到设备wks$1的IP记录" fi
额外提醒
如果这个脚本会处理不可信的输入(比如来自外部用户的参数),直接拼接SQL会有SQL注入风险。这种情况下建议用MySQL的预处理语句,但如果是你自己内部使用的脚本,上面的写法完全够用。
内容的提问来源于stack exchange,提问作者teamg
相关产品推荐
相关产品推荐

