その後、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
)。RE一致はデフォルトでは固定されていないため、最後のコンテンツには必要ありません。
答え3
awk
cat
sumのすべての操作はここで行うことができます[[...]]
。
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