版本号的 shell 脚本条件

SKY*_*ine 1 shell conditional-statements

我对 shell 脚本真的很陌生,我想检查软件版本号并为其设置条件。

\n\n

例如:检查 python 版本\xc2\xa0> 2.7.0\n然后\n...

\n\n

我可以使用以下命令检查 python:

\n\n
if [ "$(python -V 2>&1)" ]\nthen\n    pyv="$(python -V 2>&1)"\n    echo "$pyv"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

Joh*_*024 5

Python 的输出并不是立即有用:

$ python -V
Python 2.7.9
Run Code Online (Sandbox Code Playgroud)

输出包括单词Python和版本号。此外,由于版本号有两位小数,因此它不是有效数字。

方法一:使用bc

一种方法是将版本转换为有效的十进制数:

$ python -V 2>&1 | awk -F'[ .]' '{printf "%s.%s%02.f",$2,$3,$4}'
2.709
Run Code Online (Sandbox Code Playgroud)

在这种形式下,版本 2.7.10 将变为 2.710。这种方法适用于 99 的点版本。如果您认为 python 有可能发布点版本 100,那么我们需要稍微更改格式。

我们现在可以使用以下方法比较数字bc

$ echo "$(python -V 2>&1 | awk -F'[ .]' '{printf "%s.%s%02.f",$2,$3,$4}') > 2.7" | bc -l
1
$ echo "$(python -V 2>&1 | awk -F'[ .]' '{printf "%s.%s%02.f",$2,$3,$4}') > 2.710" | bc -l
0
Run Code Online (Sandbox Code Playgroud)

要在if声明中使用它:

if echo "$(python -V 2>&1 | awk -F'[ .]' '{printf "%s.%s%02.f",$2,$3,$4}') > 2.7" | bc -l | grep -q 1
then
    echo version greater than 2.7
fi
Run Code Online (Sandbox Code Playgroud)

如果测试成功,bc -l则打印出1标准输出。为了默默地测试 是否存在1,我们使用grep -q 1.

方法2:使用整数比较

我们使用 awk 将版本号转换为整数形式:

$ python -V 2>&1 | awk -F'[ .]' '{printf "%2.f%02.f%02.f",$2,$3,$4}'
 20709
Run Code Online (Sandbox Code Playgroud)

现在,我们可以使用标准 shell 工具来测试版本:

if [ "$(python -V 2>&1 | awk -F'[ .]' '{printf "%2.f%02.f%02.f",$2,$3,$4}')" -gt 20700 ]
then
   echo version greater than 2.7
fi
Run Code Online (Sandbox Code Playgroud)

方法 3:使用 GNUsort -V

GNU sort 有版本排序功能。为了使用它,我们创建对版本排序有用的输入:

$ t="Python 2.7.0"
$ echo "$(python -V 2>&1)"$'\n'"$t" | sort -V -k2,2
Python 2.7.0
Python 2.7.9
Run Code Online (Sandbox Code Playgroud)

现在,我们按升序排序:

$ echo "$(python -V 2>&1)"$'\n'"$t" | sort -V -k2,2
Python 2.7.0
Python 2.7.9
Run Code Online (Sandbox Code Playgroud)

如果第一行是$t,则意味着实际的 python 版本较新:

t="Python 2.7.0"
if echo "$(python -V 2>&1)"$'\n'"$t" | sort -V -k2,2 | head -n1 | grep -q "$t"
then
    echo "version greater than $t"
fi
Run Code Online (Sandbox Code Playgroud)

由于 GNUsort -V被设计为本地处理版本号,这是我更喜欢的方法。