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

相關內容