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