我正在编写一个 shell 脚本来下载某些软件的最新版本。在我解析输出后,curl
我通过几个步骤来找到确切的版本字符串(在写这篇文章的时候是0.65.3
):
(在下面的所有代码示例中,>
都是我的提示。来自 Bash 3.2 或 Zsh 的输出位于没有>
前缀的行上。)
> url="https://github.com/gohugoio/hugo/releases/latest"
> latest=$(curl --silent --head "$url" | grep Location)
> tag=$(echo "$latest" | cut -d'/' -f8)
> version=$(echo "${tag//v}")
> echo "hugo_${version}_Linux-64bit.tar.gz"
_Linux-64bit.tar.gz
我期望的输出是hugo_0.65.3_Linux-64bit.tar.gz
,但是在使用带引号的字符串的调用的输出中,echo
似乎后面的字节${version}
已用于覆盖带引号的字符串开头的字节。
在这里,我使用两个不同的引用字符串来澄清正在发生的事情:
> echo "hugo_${version}test"
test_0.65.3
> echo "hugo_${version}lorem ipsum dolor sit amet"
lorem ipsum dolor sit amet
如果我这样做,我会得到同样的意外结果:
> version=$(echo "${tag:1}")
> echo "hugo_${version}_Linux-64bit.tar.gz"
_Linux-64bit.tar.gz
但是,如果我这样做,我会得到预期的结果:
> version=0.65.3
hugo_0.65.3_Linux-64bit.tar.gz
最后一个结果是必需的,但当然它使我的脚本是静态的而不是动态的,因此对我来说不是很有用。如何在不硬编码$version
脚本中的值的情况下获得所需的结果?