2021SC@SDUSC
fetch_package.sh的代码如下:
#!/bin/bash
#
# Fetch a Rime data package from GitHub
#
package_name="$1"
shift
if [[ -z "${package_name}" ]]; then
echo "Usage: $(basename "$0") <package-name> [<directory>] [-b <branch>]"
exit 1
fi
resolve_package_name() {
local name="$1"
if [[ ${name} =~ [^/]*/[^/]* ]]; then
echo ${name}
elif [[ ${name} =~ rime-[^/]* ]]; then
echo rime/${name}
else
echo rime/rime-${name}
fi
}
package_url="https://github.com/$(resolve_package_name "${package_name}").git"
git_version_greater_or_equal() {
local target_major="$1"
local target_minor="$2"
local git_version_pattern='^git version ([0-9]*)\.([0-9]*).*$'
if [[ "$(git --version | grep '^git version')" =~ $git_version_pattern ]]; then
local major="${BASH_REMATCH[1]}"
local minor="${BASH_REMATCH[2]}"
[[ "${major}" -gt "${target_major}" ]] || (
[[ "${major}" -eq "${target_major}" ]] && [[ "${minor}" -ge "${target_minor}" ]]
)
else
return 1
fi
}
clone_options=(
--depth 1
--recurse-submodules
)
if git_version_greater_or_equal 2 9; then
clone_options+=(
--shallow-submodules
)
fi
git clone ${clone_options[@]} "${package_url}" "$@"
这个脚本文件是用来从GitHub中获取Rime数据包的。
开始定义了一个变量package_name,它的值为传入的第一个参数。然后shift将参数左移。也就是第二个参数变成第一个参数,第三个参数变成第二个参数,依次类推……
接下来判断package_name是否为零。
如果为零,将 "Usage: $(basename "$0") <package-name> [<directory>] [-b <branch>]"输出。其中"$0"为这个shell的文件名。并且以异常状态退出。
然后看resolve_package_name这个函数。函数中定义了一个本地变量name,赋值为第一个参数。
然后通过正则表达式进行筛选。[^/]匹配除了'/'以外的任意一个字符。也就是说这个name不以/开头。*将[^/]匹配任意多次。如果name匹配a/a,a为除了'/'以外的任意一个字符。就直接输出name.如果name匹配rime-a,a为除了'/'以外的任意一个字符,输出rime/rime-a.除了这两种情况,直接就直接输出rime/rime-a(a为name的值)。
package_url定义为"https://github.com/$(resolve_package_name "${package_name}").git",是将该数据的定位给储存起来。
再看git_version_greater_or_equal函数,这个函数用来判断当前版本是更新的还是相同的。target_major赋值为第一个变量,target_minor赋值为第二个变量。git_version_pattern为git version打头紧接数字和.以及另一个数字。由于.*匹配任意内容。所以可以以任意内容结尾。如果git的version是匹配的,将major和minor将bash_rematch[ ]的第二个和第三个元素赋值给major和minor。如果major是大于target_major或者major和target_major相等时minor大于等于target_minor,则返回true.如果版本不匹配,异常状态退出。