从字符串中提取数字

Pra*_*kar 4 command-line scripts 12.04

使用此 ubuntu 命令时:

${HOME}/temp/.git describe --always --tags HEAD 
Run Code Online (Sandbox Code Playgroud)

此命令的输出是:

v0.1.5-2-p343h3d3
Run Code Online (Sandbox Code Playgroud)

我想1.5从上面的输出中提取并检查它是否大于 1.5。
有没有办法解决这个问题。?

Oli*_*Oli 5

版本号实际上很难比较,因为它们通常不是标准的数学比较(例如这个有两个小数点会导致bc抛出)。

因此,我转向了一个鲜为人知的选项,sort它可用于对版本字符串进行排序。考虑以下:

$ echo -e "v0.1.5\nv0.1.6-2-p343h3d3" | sort -V
v0.1.5
v0.1.6-2-p343h3d3

oli@bert:~$ echo -e "v0.1.5\nv0.1.4-2-p343h3d3" | sort -V
v0.1.4-2-p343h3d3
v0.1.5
Run Code Online (Sandbox Code Playgroud)

这基本上意味着我们可以对版本进行排序,以便最新的在最后一行。我们所要做的就是与最后一行、在if或 快捷方式中的字符串进行比较:

[[ $(echo -e "v0.1.5\nv0.1.4-2-p343h3d3" | sort -V | tail -1) != "v0.1.5" ]] && echo NEWER
Run Code Online (Sandbox Code Playgroud)

玩弄v0.1.4-2-p343h3d3绳子。如果你坚持0.1.6会回声。

现在把这一切带回到你的命令中:

[[ $(echo -e "v0.1.5\n$(${HOME}/temp/.git describe --always --tags HEAD)" | sort -V | tail -1) != "v0.1.5" ]] && echo NEWER
Run Code Online (Sandbox Code Playgroud)

或者您可以将其分解以提高可读性:

THRESHOLD="v0.1.5"
VERSION=$(${HOME}/temp/.git describe --always --tags HEAD)
if [[ $(echo -e "$THRESHOLD\n$VERSION" | sort -V | tail -1) != "$THRESHOLD"  ]]; then
    echo GREATER
fi
Run Code Online (Sandbox Code Playgroud)