我是 bash 新手,正在编写一个脚本,需要比较内核的次要版本以查看它是否大于或等于 10,如果不大于或等于 10,则退出。目前我有这样的东西:
KERNEL=$(uname -r)
declare -i MINOR_VERSION=$(echo $KERNEL | cut -c 3-4)
if [ "10" -gt "$MINOR_VERSION"]; then exit 0; fi
这是错误的代码,如果次要版本小于 10,则不起作用,因为我正在使用 cut 并依赖于它是两位数。我可能需要的是使用点解析次要版本的东西。 示例:
$ uname -r
3.4.0-60-generic
$ MNR_VAR=<awesome bash code, with cut or sed or something>
$ echo $MNR_VAR
4
我一直在阅读 cut
和 sed
文档,但学习速度很慢。我将不胜感激的帮助!
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"
最佳答案
在纯 bash 中:
#!/bin/bash
ker="$(uname -r)"
minker="${ker#*.}"
minker="${minker%%.*}"
echo "$minker"
"${ker#*.}"
是 $ker
中 .
的第一个匹配项之后的字符串。因此
$minker
变为 13.0-generic...
从 3.13.0-generic...
"${minker%%.*}"
是在 中删除
。因此,.
及其后面的所有匹配项(从右开始)后留下的字符串$minker$minker
从 13.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]}
关于linux - 将次要版本从内核提取到 bash 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30856609/