在bash
我做了以下事情。该if
表达式将计算true
Redhat 版本是 7.5 还是 7.6。
if [[ ` cat /etc/redhat-release | awk '{print $7}' ` == "7.5" ]] || [[ ` cat /etc/redhat-release | awk '{print $7}' ` == "7.6" ]]
then
.
.
.
我们可以用正则表达式以更优雅的方式做到这一点吗?
这是以下内容/etc/redhat-release
:
cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
答案1
直接检查释放字符串就简单得多
if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...
该grep
命令通过正则表达式进行匹配。原子[56]
匹配5
or 6
,允许模式匹配7.5
or 7.6
。自从.
比赛以来任何字符我用反斜杠转义了它,以便它与文字点匹配。尾随空格确保匹配的版本字符串后面没有其他字符。
答案2
您可以使用bash
的内置字符串匹配来完成此操作。请注意,这使用 glob(通配符)模式,而不是正则表达式。
if [[ $(cat /etc/redhat-release | awk '{print $7}') == 7.[56] ]]
或者,我们消除乌鲁克:
if [[ $(awk '{print $7}' /etc/redhat-release) == 7.[56] ]]
或者...
if [[ $(cat /etc/redhat-release) == *" release 7."[56]" "* ]]
甚至(感谢@kojiro)...
if [[ $(< /etc/redhat-release) == *" release 7."[56]" "* ]]
(请注意,需要在开头和结尾使用通配符以使其匹配整行。数字后面的引号空格是为了确保它不会意外匹配“7.50”。)
或者,如果您确实想使用正则表达式,请使用=~
并切换到 RE 语法:
if [[ $(< /etc/redhat-release) =~ " release 7."[56]" " ]]
(请注意,引号中的部分将按字面意思匹配,因此.
不需要转义或括起来(只要您不启用bash31
兼容性)。默认情况下,RE 匹配不会锚定,因此您不需要结尾处的任何内容,如最后一个。)
答案3
awk
cat
可以在这里完成和的所有工作[[...]]
:
if
</etc/redhat-release awk -v ret=1 '
$7 ~ /^7\.[56]$/ {ret=0}
END {exit(ret)}'
then
...
或者仅使用标准sh
语法和简单的通配符模式匹配:
case $(cat /etc/redhat-release) in
(*'release 7.'[56]' '*) ...;;
(*) ...;;
esac
答案4
Bash 可以使用 提取一行的第 7 字段read
,并且这些“/etc/*-release”类型的文件无论如何都往往是一行。考虑
read _ _ _ _ _ _ ver _ < /etc/redhat-release
if [[ $ver = 7.[56] ]]; then
# match
fi