if 在 bash 代码中使用正则表达式

if 在 bash 代码中使用正则表达式

bash我做了以下事情。该if表达式将计算trueRedhat 版本是 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]匹配5or 6,允许模式匹配7.5or 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

awkcat可以在这里完成和的所有工作[[...]]

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

相关内容