#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
Baştaki ~normal ifadede lider ne yapar ?
#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
Baştaki ~normal ifadede lider ne yapar ?
Yanıtlar:
~Aslında operatör parçası olan =~kendi sağda genişletilmiş düzenli ifade soldan onun için dize düzenli bir ifade eşleştirmesi gerçekleştirir.
[[ "string" =~ pattern ]]
Dize alıntı yapılması gerektiğini ve düzenli ifadenin alıntılanmaması gerektiğini unutmayın.
Benzer bir operatör, Perl programlama dilinde kullanılır.
Anlaşılan normal ifadeler bash, GNU'nun bayrak grepile anladığı ifadelerle aynıdır -E, yani genişletilmiş düzenli ifadeler kümesi.
Biraz konu dışı, ama bilmek güzel:
Yakalama grupları içeren normal bir ifadeyle eşleşirken, her grup tarafından yakalanan dizenin kısmı BASH_REMATCHdizide bulunur. Bu dizi tekabül sıfırıncı / ilk giriş &yerine deseninde sed'in ikame komutu (veya $&Perl) deseni ile eşleşen dize bit, itibaren indeksi 1 giriş ve karşılık gelirken için \1, \2vb ., bir in sedyedek model (ya da $1, $2vb Perl), yani her bir parantez ile eşleşen bit.
Örnek:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
Bu çıktı olabilir
Got 09, 19 and 14
eğer şimdiki zaman 09:19:14 olur.
REMATCHBit BASH_REMATCHdizisi adı "Düzenli İfade Maç", yani "RE-Match" dan gelmektedir.
bashBourne benzeri olmayan kabuklarda, exprsınırlı düzenli ifade eşleştirmesi için de kullanılabilir (yalnızca basit düzenli ifadeler kullanarak).
Küçük bir örnek:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
grep -EGNU sistemlerinde ve sadece model olarak işaretlenmemiş bir değişken kullanıldığında ne anlama geldiğiyle aynıdır [[ $var = $pattern ]](bkz. [[ 'a b' =~ a\sb ]]Vs p='a\sb'; [[ 'a b' =~ $p ]]). Ayrıca, kabuk alıntılamanın RE operatörlerinin anlamını etkilediğini ve RE işlemesini etkileyebilecek kabuk belirteçleme için bazı karakterlerin alıntılanması gerektiğine dikkat edin. [[ '\' =~ [\/] ]]false döndürür. ksh93Daha da kötüsü var. zshShell ve RE alıntılarının açıkça ayrı olduğu daha mantıklı bir yaklaşım için bakınız (veya bash 3.1). [Arasında yerleşik zshve yashaynı zamanda bir var =~operatörü.
off-topic! +1 (
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]. Ya da bir alıntı *aynı zamanda? [[ "This is a fine mess." =~ "T.........fin*es*" ]].
[[ a =~ .* ]]ya da [[ a =~ '.*' ]]ya da [[ a =~ \.\* ]], aynı .*RE geçirilir =~operatör. OTH, içinde bash, [[ '\' =~ [)] ]]bir hata döndürür, sen ister denemeye olmadan bilemez [[ '\' =~ [\)] ]]maçların? Peki ya [[ '\' =~ [\/] ]](ksh93'te yapar). Peki ya c='a-z'; [[ a =~ ["$c"] ]]( =operatörle karşılaştır )? Ayrıca bakınız: [[ '\' =~ [^]"."] ]]bunu yapabilirsiniz sahte ... Not döndürür shopt -s compat31içinde bashalmak zshdavranışı.
zsh/ bash -o compat31'ın davranışı [[ a =~ '.*' ]]da [ a '=~' '.*' ]( [destekleyen uygulamalar için =~) veya ile tutarlıdır expr a : '.*'. OTOH, [[ a = '*' ]]vs ile tutarlı değil [[ a = * ]](ancak o zaman, globs kabuk dilin bir parçası, RE'ler değil).
[[ expression ]]Bölümün altındaki bash man sayfalarını okumalısınız .
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
Uzun lafın kısası, =~tıpkı ==ve gibi bir operatördür !=. Dizedeki gerçek regex ile sağındaki hiçbir ilgisi yoktur.
=~Gerçek hayatta kullanımını gösteren bazı örnekler bulabilir misiniz ...?
man [[ expresssion ]]ve man [[hiçbir şey döndürmeyin. Dahili bir bash komutundan help [[bu yana yararlı bilgi verir - [[fakat =~temel veya genişletilmiş regex sözdizimi kullanıp kullanmadığını söylemez . Quot Aldığınız metin bash man sayfasındandır. “Beşli erkek sayfalarını oku” dediğini fark ettim, ama ilk önce, beşli erkek sayfalarını okumak istediğini sanıyordum. Her halükarda man bash, 4139 satır (72 sayfa) uzunluğunda büyük bir dosya döndürür. /▒▒▒Lezzeti =~- aynen - belirtilmemiş olan bir regex alan tuşuna basılarak aranabilir .