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

时间:2015-06-15 23:29:21

标签: linux bash sed cut

我是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。 &#34; 3.13.0.x&#34;返回&#39; 13&#39;,&#34; 3.2.0.x&#34;返回&#39; 2&#39;等

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

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

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

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

3 个答案:

答案 0 :(得分:3)

纯粹的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 Regex:

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

答案 1 :(得分:1)

问题是您使用的是-c cut。不要那样做。

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

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

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

<<< "$(uname -r)"的用法是特定于bash的(我相信),但是不需要管道(|)及其涉及的子shell。

答案 2 :(得分:-1)

仅提取次要版本&amp;将它与某些东西进行比较是有风险的,因为主要数字也可以改变......

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

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