如何在Shell脚本中验证UPDATE或SELECT查询语句?
Shell脚本中验证UPDATE/SELECT查询语句的解决方案
我来帮你搞定这个SQL语句验证的问题!你需要确保语句的首个单词是update或select,对于UPDATE语句还要检查第二个单词是指定的table_name、第三个单词是set,下面给你两种实用的实现方式:
方法一:拆分语句为单词数组验证
这种方法直观易懂,适合需要灵活扩展验证规则的场景,比如后续要检查更多位置的单词:
#!/bin/bash # 测试用的SQL语句,可以换成用户输入的变量 sql_query="update table_name set col_name = 1 where emp_id = '1234'" # 将SQL语句按空格拆分成单词数组(自动忽略连续空格) read -ra sql_words <<< "$sql_query" # 开始验证逻辑 first_word="${sql_words[0],,}" # 转成小写,兼容大小写输入 if [[ "$first_word" == "update" ]]; then # 验证UPDATE语句的规则 if [[ "${sql_words[1]}" == "table_name" ]]; then if [[ "${sql_words[2],,}" == "set" ]]; then echo "✅ UPDATE语句验证通过!" else echo "❌ 错误:第三个单词必须是set" fi else echo "❌ 错误:第二个单词必须是table_name" fi elif [[ "$first_word" == "select" ]]; then # 这里可以扩展SELECT语句的验证规则,比如检查第三个单词是from等 echo "⚠️ SELECT语句的验证逻辑可以在这里补充(例如检查第二个单词为列名/星号,第三个为from)" else echo "❌ 错误:语句首个单词必须是update或select" fi
关键细节说明:
${var,,}是Bash的扩展语法,用于把字符串转成小写,这样不管用户输入UPDATE还是update都能匹配read -ra会把输入的字符串按空格(包括连续空格、制表符)拆分成数组,完美处理SQL语句中的空格分隔问题
方法二:用正则表达式匹配
如果你的验证规则比较固定,用正则会更简洁,还能直接匹配整个语句的格式:
#!/bin/bash sql_query="update table_name set col_name = 1 where emp_id = '1234'" # 正则匹配UPDATE语句:支持大小写、连续空格 update_pattern="^[Uu][Pp][Dd][Aa][Tt][Ee]\s+table_name\s+[Ss][Ee][Tt]" select_pattern="^[Ss][Ee][Ll][Ee][Cc][Tt]" if [[ "$sql_query" =~ $update_pattern ]]; then echo "✅ UPDATE语句验证通过!" elif [[ "$sql_query" =~ $select_pattern ]]; then echo "⚠️ SELECT语句验证逻辑可扩展(例如添加后续的from、表名规则)" else echo "❌ 错误:不符合要求!UPDATE语句需满足:首单词为update,第二个为table_name,第三个为set;SELECT语句首单词必须为select" fi
关键细节说明:
^表示匹配字符串的开头,确保验证的是语句的第一个单词\s+匹配一个或多个空格,处理语句中可能存在的连续空格[Uu]这种写法实现了不区分大小写的匹配,兼容不同的输入格式
你可以根据自己的实际需求选择其中一种方法,要是需要更复杂的验证(比如检查WHERE子句的格式),还可以在现有逻辑上继续扩展~
内容的提问来源于stack exchange,提问作者Jammu
相关产品推荐
相关产品推荐

