GNU/Linux >> Linux の 問題 >  >> Linux

bashコードで正規表現を使用する場合

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

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

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


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

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

または、UUoC を排除します:

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


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

Linux
  1. バイナリを /bin、/sbin、/usr/bin、および /usr/sbin にインストールし、 --prefix および DESTDIR と対話します

  2. #!/usr/bin/env bash と #!/usr/bin/bash の違いは何ですか?

  3. 最後の終了コードを含む Bash プロンプト

  1. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  2. /etc/passwd はグループ内のユーザーを表示しますが、/etc/group は表示しません

  3. Linux の /etc/init.d と /etc/rcX.d ディレクトリの間の接続は何ですか?

  1. Linux –デーモンをLinuxで起動させますか?

  2. / etc / motdはどのように更新されますか?

  3. BASH:ユーザーのパスワードがロックされている場合は、/etc/shadow をチェックインします