GNU/Linux >> Znalost Linux >  >> Linux

pokud s regulárním výrazem v kódu bash

Daleko jednodušší, stačí přímo zkontrolovat uvolňovací řetězec

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

grep příkaz odpovídá regulárnímu výrazu. [56] atom odpovídá 5 nebo 6 , což umožňuje, aby se vzor shodoval na 7.5 nebo 7.6 . Od . odpovídá jakémukoli znaku Unikl jsem to zpětným lomítkem, takže to odpovídá doslovné tečce. Mezera na konci zajišťuje, že za řetězcem odpovídající verze nejsou žádné další znaky.


Můžete to udělat pomocí bash vestavěné porovnávání řetězců. Všimněte si, že to používá vzory glob (zástupné znaky), nikoli regulární výrazy.

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

Nebo odstraníme UUoC:

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

nebo...

if [[ $(cat /etc/redhat-release) == *" release 7."[56]" "* ]]

nebo dokonce (díky @kojiro)...

if [[ $(< /etc/redhat-release) == *" release 7."[56]" "* ]]

(Všimněte si, že zástupné znaky na začátku a konci jsou potřeba, aby odpovídaly celému řádku. Mezera v uvozovkách za číslem má zajistit, aby se náhodně neshodovalo s "7,50".)

Nebo pokud opravdu chcete používat regulární výrazy, použijte =~ a přepněte na RE syntaxi:

if [[ $(< /etc/redhat-release) =~ " release 7."[56]" " ]]

(Všimněte si, že část v uvozovkách bude uvedena doslovně, takže . nemusí být escapováno nebo hranaté (pokud nepovolíte bash31 kompatibilita). A shody RE nejsou standardně ukotveny, takže na koncích nic nepotřebujete jako v tom posledním.)


awk dokáže veškerou práci cat a [[...]] zde:

if
  </etc/redhat-release awk -v ret=1 '
    $7 ~ /^7\.[56]$/ {ret=0}
    END {exit(ret)}'
then
  ...

Nebo jen se standardním sh syntaxe s jednoduchou shodou se zástupnými znaky:

case $(cat /etc/redhat-release) in
  (*'release 7.'[56]' '*) ...;;
  (*) ...;;
esac

Linux
  1. Vzor regulárního výrazu pro úpravu souboru /etc/sudoers

  2. Jaký je rozdíl mezi #!/usr/bin/env bash a #!/usr/bin/bash?

  3. Bash Prompt s posledním výstupním kódem

  1. Kdy mám použít /dev/shm/ a kdy /tmp/?

  2. /etc/passwd zobrazuje uživatele ve skupině, ale /etc/group nikoli

  3. Seřadit pomocí oddělovače polí

  1. BASH:Zkontrolujte v /etc/shadow, pokud je heslo uživatele uzamčeno

  2. Rozdíl mezi /etc/hosts a /etc/resolv.conf

  3. Jak nastavit /etc/issues, aby zobrazoval IP adresu pro eth0