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

yae*_*ael 5 linux bash regular-expression

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
.
.
.
Run Code Online (Sandbox Code Playgroud)

我们可以用正则表达式以更优雅的方式做到这一点吗?

这是内容/etc/redhat-release

cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 15

直接检查发布字符串要简单得多

if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...
Run Code Online (Sandbox Code Playgroud)

grep命令通过正则表达式匹配。的[56]原子火柴56,使图案以匹配7.57.6。由于.匹配任何字符,我用反斜杠对其进行了转义,以便它与文字点匹配。尾随空格确保匹配的版本字符串后面没有其他字符。

  • @Kusalananda 是的。锚定模式以避免“7.59”甚至“7.5.9”。 (4认同)

Gor*_*son 11

您可以使用bash的内置字符串匹配来做到这一点。请注意,这使用 glob(通配符)模式,而不是正则表达式。

if [[ $(cat /etc/redhat-release  | awk '{print $7}') == 7.[56] ]]
Run Code Online (Sandbox Code Playgroud)

或者,我们消除了UUoC

if [[ $(awk '{print $7}' /etc/redhat-release) == 7.[56] ]]
Run Code Online (Sandbox Code Playgroud)

或者...

if [[ $(cat /etc/redhat-release) == *" release 7."[56]" "* ]]
Run Code Online (Sandbox Code Playgroud)

甚至(感谢@kojiro)...

if [[ $(< /etc/redhat-release) == *" release 7."[56]" "* ]]
Run Code Online (Sandbox Code Playgroud)

(注意开头和结尾需要通配符才能匹配整行。数字后面的引号空格是为了确保它不会意外匹配“7.50”。)

或者,如果您真的想使用正则表达式,请使用=~并切换到 RE 语法:

if [[ $(< /etc/redhat-release) =~ " release 7."[56]" " ]]
Run Code Online (Sandbox Code Playgroud)

(请注意,引号中的部分将按字面匹配,因此.不需要转义或括号(只要您不启用bash31兼容性)。默认情况下不锚定 RE 匹配,因此您不需要任何像最后一个一样的结尾。)