【问题标题】:Extract minor version from kernel to bash variable从内核中提取次要版本到 bash 变量
【发布时间】:2015-08-31 14:58:34
【问题描述】:

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

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

这是错误的代码,如果次要版本

$ 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"

【问题讨论】:

  • KERNEL = $(uname -r) 不正确; = 周围不能有空格。此外,您最终还需要注意主要数字; 3.9 太旧了,但 4.1 大概不是。
  • 感谢空格可能是来自恶意笔记程序的自动更正。我很欣赏对主要版本的评论,我已经考虑过了,肯定也会检查。

标签: linux bash sed cut


【解决方案1】:

在纯 bash 中:

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

"${ker#*.}"$ker. 第一次匹配后的字符串。因此 $minker3.13.0-generic... 变为 13.0-generic...

"${minker%%.*}" 是在$minker 中删除. 及其之后的所有匹配项(从右侧开始)后留下的字符串。因此$minker13.0-generic...变成13

See the Bash Parameter Expansion Manual for more info

使用 Bash 正则表达式:

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

【讨论】:

  • 这很好,我以前见过这种表示法,但乍一看它并不是最易读的。您能否进一步解释一下或指出我要阅读的内容的方向?谢谢!
  • 我找到了this guide,这对理解第一个答案很有帮助。
  • @jdfLemon 加了一点解释和新方法
  • 感谢您的额外解释! @贾希德
【解决方案2】:

问题是您使用-ccut。不要那样做。

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

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

或使用IFS=. read -r _ minor _rest &lt;&lt;&lt; "$(uname -r)"; echo "$minor"(其好处是不使用任何外部实用程序)。

&lt;&lt;&lt; "$(uname -r)" 的用法是特定于 bash 的(我相信),但避免了对管道 (|) 及其涉及的子 shell 的需要。

【讨论】:

  • 非常感谢! MNR_VAR=$(echo $KERNEL | cut -d '.' -f2) 效果很好,和我以前一样。您的 awk 答案可能是我将使用的,效果很好,并且是一个不错的单行线。我非常感谢您的帮助,这也有助于一些文档更有意义。
【解决方案3】:

仅提取次要版本并将其与某些内容进行比较是有风险的,因为主要编号也可以更改...

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

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

【讨论】:

  • 为什么要投反对票?请发表评论。 IMO,这种方法比其他答案建议的仅比较次要版本更可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2012-09-05
  • 2012-01-30
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多