zsh环境下如何将函数参数传递给grep以获取GitHub API数据
修复zsh下GitHub API通用函数的问题
问题根源
- return语句误用:zsh的
return仅用于返回整数状态码,无法返回字符串内容。要让函数输出能被外部捕获的结果,需用echo输出内容而非return。 - 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
相关产品推荐
相关产品推荐

