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

zsh环境下如何将函数参数传递给grep以获取GitHub API数据

修复zsh下GitHub API通用函数的问题

问题根源

  1. return语句误用:zsh的return仅用于返回整数状态码,无法返回字符串内容。要让函数输出能被外部捕获的结果,需用echo输出内容而非return。
  2. JSON处理不健壮:原代码用grep+sed匹配JSON字段,既没考虑字段后可能存在的空格(如"tag_name": "v6.9.1"),也无法处理字段值含引号、换行的情况,容易匹配失败。

方案1:修复原有grep+sed实现

调整函数逻辑,修正return用法并优化正则匹配:

get_github()
{
    local github_token=$(</path/to/github_token.txt)
    # 用local限制变量作用域,避免污染全局环境
    curl -s "https://api.github.com/repos/$1/releases/latest" \
        --header "Authorization: Bearer $github_token" |
        grep -E "\"$2\"[[:space:]]*:" |
        sed -E 's/.*"'"$2"'[[:space:]]*":[[:space:]]*"([^"]+)".*/\1/'
}
  • curl -s:静默模式,屏蔽进度输出干扰
  • grep正则:匹配带任意空格的目标字段格式("字段名": 或 "字段名" :)
  • sed正则:精准定位目标字段,提取对应值

方案2:使用jq处理JSON(推荐)

jq是专门处理JSON的工具,适配所有JSON格式场景,代码更简洁可靠:
先安装jq(未安装时执行):

brew install jq

修改函数为:

get_github()
{
    local github_token=$(</path/to/github_token.txt)
    curl -s "https://api.github.com/repos/$1/releases/latest" \
        --header "Authorization: Bearer $github_token" |
        jq -r ".$2"
}
  • jq -r ".$2":-r输出原始字符串(不带双引号),.$2直接提取根节点下的指定字段

调用测试

两种方案的调用方式完全不变:

version=$(get_github PHPMailer/PHPMailer tag_name)
published_at=$(get_github PHPMailer/PHPMailer published_at)
zipball_url=$(get_github PHPMailer/PHPMailer zipball_url)

echo $version
echo $published_at
echo $zipball_url

内容的提问来源于stack exchange,提问作者Devin Emke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:35:13