linux shell 中用 curl 调用 api 需构造正确请求(-s、-g、-h、-d、-u 等)、配合 jq 解析 json、用 -f 和 http 状态码判断成败、设置超时(-m)、记录日志并封装为函数提升复用性。

Linux Shell 脚本中用 curl 调用 API 获取数据,是运维和数据采集场景中最常用的方式之一。关键在于构造正确的请求、处理响应、提取有效字段,并做好错误应对。
构造基础 curl 请求
最简调用形式为:curl -s "https://api.example.com/data"
其中 -s(silent)可屏蔽进度条,避免干扰脚本输出。如需携带参数,推荐用 -G(自动拼接 URL 查询字符串)加 --data-urlencode,避免手动拼接出错:
curl -s -G "https://api.example.com/search" --data-urlencode "q=linux" --data-urlencode "page=1"- 若需 POST JSON 数据,加上
-H "Content-Type: application/json"和-d '{"key":"value"}' - 带认证时,可用
-u "user:pass"(Basic Auth)或-H "Authorization: Bearer xxx"
安全可靠地提取返回数据
API 响应多为 JSON,Shell 原生不支持解析,建议搭配 jq 工具(轻量、高效、专为 JSON 设计):
- 安装:Ubuntu/Debian 执行
sudo apt install jq;CentOS/RHEL 用sudo yum install jq - 提取字段示例:
curl -s "https://httpbin.org/json" | jq -r '.slideshow.title',-r输出原始字符串,无引号 - 判断响应是否成功再提取:
if [ $(curl -s -o /dev/null -w "%{http_code}" "https://api.example.com/test") = "200" ]; then ... fi
写入文件与错误处理
自动化任务必须考虑失败情况,不能让一次网络异常导致整个流程中断:
- 用
-f参数使 curl 遇到非 2xx 状态码时返回非零退出码,配合||或if捕获:curl -sf "https://api.example.com/data" > data.json || echo "请求失败" >&2 - 记录时间戳和状态便于排查:
echo "$(date): $(curl -sf -o /dev/null -w "%{http_code}" "https://api.example.com/ping")" >> log.txt - 限制超时避免挂起:
curl -m 10 -sf "https://api.example.com/data"(10 秒超时)
封装成可复用的函数
把重复逻辑抽象为函数,提升脚本可读性和维护性:
get_api_data() {
local url="$1"
local timeout="${2:-5}"
local response=$(curl -s -m "$timeout" -f "$url" 2>/dev/null)
if [ $? -eq 0 ]; then
echo "$response"
else
echo "" # 返回空字符串表示失败
fi
}
<h1>使用示例</h1><p>data=$(get_api_data "<a href="https://www.php.cn/link/816f29f7fcace6a71651550c57d8705e">https://www.php.cn/link/816f29f7fcace6a71651550c57d8705e</a>")
if [ -n "$data" ]; then
name=$(echo "$data" | jq -r '.name')
echo "GitHub 用户名:$name"
else
echo "获取用户信息失败"
fi</p>











