Shell脚本比较curl返回的HTTP响应码时出现语法错误怎么解决
Shell curl响应码区间校验报错修复方案
错误原因
- 语法不兼容:脚本开头声明的是
#!/bin/sh,(( ))是Bash特有的算术表达式语法,不属于POSIX sh规范,直接运行会触发语法错误。 - 比较符混用:
(( ))算术块内需要使用<、>=类符号做比较,-lt、-ge是test命令([ ])专用的整数比较符,两者不能混用。 - 前导零解析风险:服务器宕机返回的
000带前导零,默认会被算术表达式识别为八进制数,若后续遇到089这类无效八进制值会直接报错。
修复方案
方案1:POSIX全兼容写法(所有sh环境可运行)
无需依赖Bash,兼容所有默认sh环境:
#!/bin/sh response1="200" #curl first url response2="000" #curl second url # 强制按十进制解析,去掉前导零 res1=$((10#$response1)) res2=$((10#$response2)) # 用标准test命令做整数比较 if [ "$res1" -ge 400 ] || [ "$res1" -lt 200 ] || [ "$res2" -ge 400 ] || [ "$res2" -lt 200 ]; then echo "Something went wrong, response code is not in success range" exit 1 else echo "Success" exit 0 fi
方案2:Bash简化写法
如果确认运行环境有Bash,把shebang改成Bash即可用更简洁的语法:
#!/bin/bash response1="200" #curl first url response2="000" #curl second url # 强制按十进制解析,去掉前导零 res1=$((10#$response1)) res2=$((10#$response2)) if (( res1 >= 400 || res1 < 200 || res2 >= 400 || res2 < 200 )); then echo "Something went wrong, response code is not in success range" exit 1 else echo "Success" exit 0 fi
之前修改无效的原因
- 替换为
[[ ]]后逻辑错误:[[ ]]中做整数比较仍需使用-lt、-ge类符号,直接用<默认执行字符串比较,会出现逻辑判定不符合预期的问题。 - 替换比较符为
<后报错:未同步修改shebang为#!/bin/bash,POSIX sh不支持(( ))语法,同时没有处理前导零的解析问题,所以触发新的报错。
内容的提问来源于stack exchange,提问作者Mykyta Shvets
相关产品推荐
相关产品推荐

