我是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
我一直在阅读cut
和sed
文档,但却一直在慢慢捡起它。我很感激你的帮助!
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"
答案 0 :(得分:3)
纯粹的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
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