Shell脚本中SQL查询结果为yes但if判断不符合预期的问题
问题分析:Shell脚本中SQL查询结果导致条件判断异常
我来帮你拆解这个问题——明明echo输出的是"yes",但if判断却走了"no"的分支,直接赋值"yes"就正常,这大概率是SQL查询返回的结果里藏着你看不到的额外字符,或者你的SQL语句本身有引号解析的问题。
核心原因拆解
隐藏的空白/控制字符
sqlcmd返回的结果通常会带有换行符(\n),如果是从Windows环境的SQL Server返回,还可能带有回车符(\r)。当你用echo "$DBVALUE"的时候,终端会自动忽略这些控制字符,看起来就是纯"yes",但实际上变量DBVALUE的内容是"yes\n"或者"yes\r\n",和你手动赋值的纯"yes"完全不一样,自然过不了!= "yes"的判断。SQL语句的引号嵌套错误
看你的SQL语句:WHERE this = "that",这里的双引号会被Shell直接解析,导致sqlcmd接收到的查询语句可能不完整或者出错,返回的结果可能包含表头、空行甚至错误信息,grep yes之后的结果也不是你预期的纯"yes"。
解决办法
1. 先修复SQL语句的引号问题
把SQL里的双引号改成单引号,或者用转义符,避免Shell解析出错:
# 方案1:SQL里的字符串用单引号 DBVALUE=$(/opt/mssql-tools/bin/sqlcmd -S server -UUser -P"Password" -dDatabase -Q"SELECT something from table WHERE this = 'that'" | grep yes) # 方案2:用单引号包裹整个SQL查询语句 DBVALUE=$(/opt/mssql-tools/bin/sqlcmd -S server -UUser -P"Password" -dDatabase -Q'SELECT something from table WHERE this = "that"' | grep yes)
2. 去除变量中的隐藏字符
用tr、sed或者xargs把多余的回车、换行、空格去掉:
# 用tr去掉回车和换行 DBVALUE=$(/opt/mssql-tools/bin/sqlcmd -S server -UUser -P"Password" -dDatabase -Q"SELECT something from table WHERE this = 'that'" | grep yes | tr -d '\r\n') # 或者用xargs自动去除所有多余空白字符(包括首尾空格、换行) DBVALUE=$(/opt/mssql-tools/bin/sqlcmd -S server -UUser -P"Password" -dDatabase -Q"SELECT something from table WHERE this = 'that'" | grep yes | xargs)
3. 调试验证
如果不确定变量里到底有什么,可以用od -c查看真实内容:
echo "$DBVALUE" | od -c
这个命令会把每个字符(包括控制字符)都显示出来,比如如果看到y e s \r \n,就说明确实有回车换行需要处理。
修改之后再运行脚本,应该就能正常触发else分支输出"yes"了。
内容的提问来源于stack exchange,提问作者Beto
相关产品推荐
相关产品推荐

