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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:54:05