web-dev-qa-db-ja.com

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)
5
yael

これは、bashの組み込みの文字列照合で実行できます。これは正規表現ではなくグロブ(ワイルドカード)パターンを使用することに注意してください。

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

または、 oC を削除します:

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一致はありません。デフォルトで固定されているため、最後のように最後に何も必要ありません。)

11
Gordon Davisson

リリース文字列を直接確認するだけではるかに簡単

if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...

grepコマンドは、正規表現で一致します。 [56] atomは5または6と一致し、7.5または7.6でパターンを一致させることができます。.任意の文字リテラルドットと一致するように、バックスラッシュでエスケープしました。末尾のスペースは、一致したバージョン文字列の後に他の文字がないことを確認します。

15
roaima

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はreadを使用して行のフィールド7を取り出すことができ、これらの「/ etc/*-release」タイプのファイルはとにかく1行になる傾向があります。検討する

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