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)
これは、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一致はありません。デフォルトで固定されているため、最後のように最後に何も必要ありません。)
リリース文字列を直接確認するだけではるかに簡単
if grep -q 'release 7\.[56] ' /etc/redhat-release
then ...
grep
コマンドは、正規表現で一致します。 [56]
atomは5
または6
と一致し、7.5
または7.6
でパターンを一致させることができます。.
は任意の文字リテラルドットと一致するように、バックスラッシュでエスケープしました。末尾のスペースは、一致したバージョン文字列の後に他の文字がないことを確認します。
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
Bashはread
を使用して行のフィールド7を取り出すことができ、これらの「/ etc/*-release」タイプのファイルはとにかく1行になる傾向があります。検討する
read _ _ _ _ _ _ ver _ < /etc/redhat-release
if [[ $ver = 7.[56] ]]; then
# match
fi