在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