我正在尝试制作一个小型shell脚本函数,基本上它应该只返回github存储库的两个最新版本(不包括最新版本(。这是我的代码:
get_release() {
curl --silent
-H "Accept: application/vnd.github.v3+json"
https://api.github.com/repos/user/repo/releases |
grep '"tag_name":' |
sed -E 's/.*"([^"]+)".*/1/'
}
#str="1.1.1 2.2.2 3.3.3 4.4.4 5.5.5 6.6.6 7.7.7 8.8.8 9.9.9"
str=($get_release)
#VERSION=$(get_release)
IFS=', ' read -r -a array <<< "$str"
LASTVERSION=${array[-2]}
PENULTIMATEVERSION=${array[-3]}
echo "${LASTVERSION}"
echo "${PENULTIMATEVERSION}"
但当我尝试运行时,我得到了这个:
t.sh: line 17: array: bad array subscript
t.sh: line 18: array: bad array subscript
注意:带注释的str变量只是一个数组的模拟,它可以正常工作,但当尝试使用get_release函数时,我会收到这个错误。
作为一个工作示例,它与3.2版以后的所有bash版本兼容:
get_releases() {
local user=$1 repo=$2
curl --silent
-H "Accept: application/vnd.github.v3+json"
"https://api.github.com/repos/$user/$repo/releases" |
jq -r '.[].tag_name'
}
IFS=$'n' read -r -d '' -a releases < <(get_releases juji-io datalevin && printf ' ')
echo "Newest release: ${releases[0]}"
echo "Oldest release: ${releases[${#releases[@]}-1]}"
echo "Second oldest: ${releases[${#releases[@]}-2]}"
截至目前,它正确发射(对于上面例子中使用的juji-io/datalevin
项目(:
Newest release: 0.6.6
Oldest release: 0.5.13
Second oldest: 0.5.14
根据@Philippe的评论,($get_release)
不会调用您的函数,但$(get_release)
会调用。
根据@Charles Duffy和@glenn jackman的评论,我已经更新了代码片段,以便安全地检查和访问数组的最后元素。
以下是修改后的代码片段:
get_release() {
curl --silent
-H "Accept: application/vnd.github.v3+json"
https://api.github.com/repos/user/repo/releases |
grep '"tag_name":' |
sed -E 's/.*"([^"]+)".*/1/'
}
# str=($get_release) # Warning: this does not call get_release
# str='1.1.1 2.2.2 3.3.3 4.4.4 5.5.5 6.6.6 7.7.7 8.8.8 9.9.9'
str=$(get_release)
IFS=', ' read -r -a array <<< "$str"
n=${#array[@]}
((n > 1)) && LASTVERSION=${array[$((n-1))]}
((n > 2)) && PENULTIMATEVERSION=${array[$((n-2))]}
echo "${LASTVERSION}" # 9.9.9
echo "${PENULTIMATEVERSION}" # 8.8.8
这里有另一个基于perl、regex和捕获组的解决方案,即
# str=($get_release) # Warning: this does not call get_release
# str='1.1.1 2.2.2 3.3.3 4.4.4 5.5.5 6.6.6 7.7.7 8.8.8 9.9.9'
str=$(get_release)
LASTVERSION=$(perl -ne 'print if s/.* (d+.d+.d+)/1/' <<< $str)
PENULTIMATEVERSION=$(perl -ne 'print if s/.* (d+.d+.d+) d+.d+.d+/1/' <<< $str)
echo "${LASTVERSION}" # 9.9.9
echo "${PENULTIMATEVERSION}" # 8.8.8
感谢所有帮助我的人,我能够以这种方式解决问题:
get_release() {
curl --silent
-H "Accept: application/vnd.github.v3+json"
https://api.github.com/repos/user/repo/releases |
grep '"tag_name":' |
sed -E 's/.*"([^"]+)".*/1/'
}
CREATE_ARRAY=$'n' read -d "