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]マッチング56パターンマッチングを許可する、7.5または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

awkcatsumのすべての操作はここで行うことができます[[...]]

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を使用して1行の7番目のフィールドを抽出することができreadます。考える

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

関連情報