使用bash脚本从字符串中提取版本
我想看看雨果的本地版本使用bash脚本从字符串中提取版本,bash,Bash,我想看看雨果的本地版本 $ hugo version Hugo Static Site Generator v0.49 linux/amd64 BuildDate: 2018-09-24T10:03:17Z 用bash脚本从上面的输出中提取v0.49,哪种方法安全可靠?我可能会使用bash的内置如下所示: $ hugo version Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown $
$ hugo version
Hugo Static Site Generator v0.49 linux/amd64 BuildDate: 2018-09-24T10:03:17Z
用bash脚本从上面的输出中提取
v0.49
,哪种方法安全可靠?我可能会使用bash的内置如下所示:
$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version
read-r\uuuuuuuuhugo\u版本<我可能会像这样使用Bash的内置read
:
$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version
read-r\uuuuuuuuuuuhugo\u版本<也许你最好像这样使用grep
:
$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version
grep-q
如果正则表达式匹配,则成功退出,因此可以与shell条件构造一起使用。我正在使用参数扩展将
替换为\.
,以便可以在正则表达式中使用版本号(否则
将匹配任何字符)
解释参数扩展的工作原理(请参见${parameter/pattern/string}
)。基本上,${version/././\\.}
全局(/
)将
替换为\.
。替换字符串中需要两个\
,因为第一个字符串会转义第二个字符串。也许您最好像这样使用grep
:
$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version
grep-q
如果正则表达式匹配,则成功退出,因此可以与shell条件构造一起使用。我正在使用参数扩展将
替换为\.
,以便可以在正则表达式中使用版本号(否则
将匹配任何字符)
解释参数扩展的工作原理(请参见${parameter/pattern/string}
)。基本上,${version/././\\.}
全局(/
)将
替换为\.
。替换字符串中需要两个\
,因为第一个字符串会转义第二个字符串。一个sed
表达式可以相当通用,只要您的版本保持为
v[any number of digits].[any number of digits]
要使用sed
,只需将hugo version
的输出通过管道传输到sed
表达式,例如
$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
示例使用/输出
您的输出将导致:
$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
v0.49
您可以使用命令替换在变量中捕获结果,例如
解释sed
表达式
sed
表达式的细分是正常替换s/find/replace/
,其中:
find
是:
^.*
-以及开头的字符数
\(
-开始一个捕获组以保存以下内容
v
-字符'v'
[0-9][0-9]*
-至少一位数字后跟零位或多位数字
[.]
-小数点(或句点),后跟
[0-9][0-9]*
-至少一位数字后跟零位或多位数字
\)
-结束保存捕获内容的捕获组
*$
-字符串末尾的所有字符
replace
是:
\1
对来自第一个捕获组的文本的单个反向引用
这就是它的范围。使用单个反向引用的正常替换,其对v0.49
的作用与对v243.871
的作用相同,只要版本保持为
v[any number of digits].[any number of digits]
要使用sed
,只需将hugo version
的输出通过管道传输到sed
表达式,例如
$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
示例使用/输出
您的输出将导致:
$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
v0.49
您可以使用命令替换在变量中捕获结果,例如
解释sed
表达式
sed
表达式的细分是正常替换s/find/replace/
,其中:
find
是:
^.*
-以及开头的字符数
\(
-开始一个捕获组以保存以下内容
v
-字符'v'
[0-9][0-9]*
-至少一位数字后跟零位或多位数字
[.]
-小数点(或句点),后跟
[0-9][0-9]*
-至少一位数字后跟零位或多位数字
\)
-结束保存捕获内容的捕获组
*$
-字符串末尾的所有字符
replace
是:
\1
对来自第一个捕获组的文本的单个反向引用
这就是它的范围。使用单一反向参考的正常替代,其对v0.49
的作用与对v243.871
的作用相同,因为您不控制hugo
,因此无法保证任何东西都是经得起未来考验的。仅供记录,在我的系统上,hugo版本
的输出是hugo静态站点生成器v0.59.0-DEV/extended linux/amd64 BuildDate:unknown
,因此,您可能需要小心此处发布的任何解决方案。您希望如何处理输出?@TomFenech如果版本不符合我的预期,我希望退出1并停止脚本,因为您无法控制hugo
,您无法保证任何内容都是经得起未来考验的。仅供记录,在我的系统上,hugo版本
的输出是hugo静态站点生成器v0.59.0-DEV/extended linux/amd64 BuildDate:unknown
,因此,您可能需要注意此处发布的任何解决方案。您想对输出做什么?@TomFenech如果版本不符合我的预期,我想退出1并停止脚本。谢谢-您介意在版本后分解斜线和点吗