我有一个回购,我正在Bash中写一个'安装脚本'。我的计划是将我想要安装的所有脚本安装在repo根目录下的scripts/
目录中,并在最顶层安装一个名为install
的脚本。
我的计划是让用户运行这样的东西:
curl -sSL http://github.com/me/repo/raw/master/install | bash
并且安装脚本将下载GitHub上目录中的所有脚本并将它们放在适当的位置。
我的问题,我将如何从Bash做到这一点?例如,GitHub以JSON的形式返回其API响应,那么我将如何解析脚本中的响应内容?有没有办法改变响应格式,所以它可以是Bash-parseable? (如果你为我的特定用例提供一个明确的例子,可以给予奖励。)
感谢。
答案 0 :(得分:4)
您不应该为此使用Github API。您可以指示用户获取原始文件:
curl -sSL https://raw.githubusercontent.com/me/repo/master/install | bash
这显然是common idiom。
另外,我更喜欢使用流程替换:
bash <(curl -sSL https://raw.githubusercontent.com/me/repo/master/install)
如果你想使用它,这会使标准输入不受伤害。
如果我误解了,并且您打算使用API来获取脚本列表,那么这将是一个多步骤的过程:
https://api.github.com/repos/user/repo/branches/master
属性中获取url
的分支树。https://api.github.com/repos/user/repo/git/trees/hash
) - 查找tree
类型的实体,path
为scripts
。blob
)https://api.github.com/repos/user/repo/git/trees/hash
类型的条目
https://api.github.com/repos/user/repo/git/blobs/hash
)然后base64
- 解码content
属性(编码也在encoding
属性中指定,因此&# 39;要处理的事情。)只需在scripts
目录中维护脚本列表,使用curl -sSL https://raw.githubusercontent.com/me/repo/master/scripts/list-of-scripts
然后curl
获取脚本就会轻松得多。然后你可以这样做,例如:
curl -sSL https://raw.githubusercontent.com/me/repo/master/scripts/list-of-scripts |
xargs -L1 -i{} curl -sSL https://raw.github.com/me/repo/master/scripts/{}
如果您确实必须使用API,最简单的方法是使用the jq
tool。在脚本中下载(根据需要更改版本,操作系统和体系结构):
curl -sSL https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 > jq
chmod +x jq
现在开始漫长的折磨之旅:
tree_url=$(curl -sSL https://api.github.com/repos/user/repo/branches/master |
./jq -r '.commit.commit.tree.url')
script_tree=$(curl -sSL "$tree_url" |
./jq -r '.tree[] | select(.type == "tree" and .path == "scripts") | .url')
curl -sSL "$script_tree" |
./jq -r '.tree[] | select(.type == "blob") | .url' |
xargs curl -sSLO
现在在每个新下载的文件上运行base64 -d
(您可以使用循环而不是xargs
来简化它。)
或者,对于最后一步,您可以这样做:
curl -sSL "$script_tree" |
./jq -r '.tree[] | select(.type == "blob") | .path' |
xargs -L1 -i{} curl -sSLO https://raw.githubusercontent.com/me/repo/master/scripts/{}