Shell脚本如何判断eval执行API请求的结果是否为[]并终止执行?
实现方案建议
先纠正你现有代码里的几个关键问题,再给出可行的实现方式:
现有代码的核心问题
- 变量赋值不能加空格:
cmd = 'xxx'要改成cmd='xxx',Shell里变量赋值前后不能有空格 - if语句语法完全错误,Shell的条件判断需要用
[ ]或[[ ]]包裹,且then要放在条件后(可换行但语法需合规) - 不能直接把eval的执行结果丢进条件判断,得先把API响应存到变量里
break是用来跳出循环的,要终止整个脚本得用exit
可行的实现方式
方式1:直接捕获curl输出(推荐,避免eval)
如果你的curl命令可以直接写,尽量别用eval,安全性更高:
# 执行curl命令,把响应存到response变量里 response=$(curl "你的API地址" [其他curl参数,比如-H、-d等]) # 检查响应是否为[] if [[ "$response" == "[]" ]]; then echo "Empty response from API" exit 1 # 终止脚本,返回非0状态码表示执行失败 fi # 响应正常时继续执行后续逻辑 echo "API响应有效,继续执行..."
方式2:必须用eval的场景(不推荐,除非迫不得已)
如果确实需要通过eval执行拼接好的命令,先把执行结果存到变量再判断:
# 注意变量赋值不要有空格 cmd='curl "你的API地址" [其他curl参数]' # 执行命令并捕获响应 response=$(eval "$cmd") # 判断响应内容 if [ "$response" = "[]" ]; then echo "Empty response from API" exit 1 fi # 后续代码逻辑 echo "继续处理有效响应..."
额外注意点
- 优先用
[[ ]]替代[ ]做条件判断,[[ ]]支持更直观的字符串比较,且不需要对空格、特殊字符做额外转义 - 如果API响应可能带多余的换行或空格,可以先清理再判断,比如:
response=$(eval "$cmd" | tr -d '\n ') # 去掉所有换行和空格
- 尽量别用
eval,如果是因为要动态拼接curl参数,可以用数组来构建命令,更安全:
# 用数组存curl参数,避免拼接字符串的风险 curl_args=("你的API地址" "-H" "Content-Type: application/json" "-d" '{"key":"value"}') response=$(curl "${curl_args[@]}")
内容的提问来源于stack exchange,提问作者bullfighter
相关产品推荐
相关产品推荐

