从内核提取次要版本到bash变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从内核提取次要版本到bash变量相关的知识,希望对你有一定的参考价值。

我是新手bash并编写一个脚本,需要比较内核的次要版本以查看它是否大于或等于10,如果不是则退出。目前我有这样的事情:

KERNEL=$(uname -r)
declare -i MINOR_VERSION=$(echo $KERNEL | cut -c 3-4)
if [ "10" -gt "$MINOR_VERSION"]; then exit 0; fi

这是错误的代码,如果次要版本<10,则不起作用,因为我使用剪切并且取决于它是两位数。我可能需要的是通过使用点解析次要版本的东西。例:

$ uname -r
3.4.0-60-generic
$ MNR_VAR=<awesome bash code, with cut or sed or something>
$ echo $MNR_VAR
4

我一直在阅读cutsed文档,但只是慢慢地把它拿起来。我很感激你的帮助!

TL; DR - 寻找一个bash命令,它将提取一个由变量中前两个点包围的int。 “3.13.0.x”返回'13',“3.2.0.x”返回'2'等。

编辑:对于那些好奇的人来说,有些答案是下面的一个。

uname -r | cut -d '.' -f2

uname -r | awk -F . '{print $2}'

kernel="$(uname -r)" | tmp="${kernel#*.}" | minor="${tmp%%.*}" | echo "$minor"
答案

问题是你正在使用-ccut。不要那样做。

使用-f-d标志来控制分隔符和要输出的字段。

或者使用awk -F . '{print $2}' <<< "$(uname -r)"

或者使用IFS=. read -r _ minor _rest <<< "$(uname -r)"; echo "$minor"(它具有不使用任何外部实用程序的好处)。

<<< "$(uname -r)"的使用是特定于bash的(我相信)但是避免了管道(|)和它所涉及的子shell的需要。

另一答案

纯粹的bash:

#!/bin/bash
ker="$(uname -r)"
minker="${ker#*.}"
minker="${minker%%.*}"
echo "$minker"

"${ker#*.}"是在.$ker第一场比赛后的字符串。因此$minker13.0-generic...成为3.13.0-generic...

"${minker%%.*}"是在.切割$minker以及之后的所有比赛(右起)留下的字符串。因此$minker13成为13.0-generic...

See the Bash Parameter Expansion Manual for more info

使用Bash正则表达式:

#!/bin/bash
regex='([0-9]+).([0-9]+)'
[[ $(uname -r) =~ $regex ]]
echo ${BASH_REMATCH[2]}
另一答案

提取次要版本并将其与某些内容进行比较是有风险的,因为主要数字也可能会发生变化......

我通常更喜欢用零填充数字,以便可以使用简单的字符串比较轻松地比较它们。

kernel_version=$(uname -r | sed -r 's/([0-9]+)/00001/g; s/0*([0-9]{4})/1/g') # gives 0003.0004.0000-0060-generic
if [[ "$kernel_version" < "0003.0010" ]]; then exit 0; fi

以上是关于从内核提取次要版本到bash变量的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核次要编号vermagic比较

Bash 脚本从 setup.py 或 PKG-INFO 文件中获取版本并导出为环境变量

如何用bash将每一行提取到不同的变量中

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

从单个按钮从多个片段中提取数据

用bash脚本从plist中提取字符串,也许是sed?