bashコードで正規表現を使用する場合

bashコードで正規表現を使用する場合

ではbash次のことを行いました。この式は、Redhat のバージョンが 7.5 か 7.6 かifを評価します。true

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]一致し、パターンはまたはに一致します。567.57.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)。また、正規表現の一致はデフォルトではアンカーされないため、最後の例のように末尾に何も付ける必要はありません。)

答え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」タイプのファイルはいずれにしても1行になる傾向があります。

read _ _ _ _ _ _ ver _ < /etc/redhat-release
if [[ $ver = 7.[56] ]]; then
    # match
fi

関連情報