Yanıtlar:
Evet, (neredeyse) tamamen eşdeğerdir.
Bir [ … ]
yapının içinde:
=
Operatörü (ya da olmayan POSIX opsiyon ==
) dize eşleştirme, değil desen eşleştirme test eder.
Bir [[ ]]
yapının içinde (insan bashından):
== ve! = Operatörleri kullanıldığında, operatörün sağındaki dize bir desen olarak kabul edilir ve aşağıda Desen Eşleme altında açıklanan kurallara göre eşleştirilir . Kabuk seçeneği nocasematch etkinleştirilirse, eşleme alfabetik karakterlerin durumuna bakılmaksızın gerçekleştirilir . Dize örüntüyle eşleşirse (==) veya eşleşmiyorsa (! =) Dönüş değeri 0, aksi takdirde 1 olur. Desenin herhangi bir kısmı, onu bir dize olarak eşleşmeye zorlamak için alıntılanabilir.
Bir case
yapı içinde (insan bash, düzenlenmiş ve benim vurgu):
[[(] desen [| desen] ...) listesindeki vaka kelimesi ;; ] ... esac
... çalışır aynı eşleştirme kullanarak, sırayla her desen karşı maç için kurallar gelince dosyayolu (aşağıdaki yol adı bölümüne bakınız). … İncelenen her bir desen tilde genişletme, parametre ve değişken genişletme, aritmetik ikame, komut ikamesi ve işlem ikamesi kullanılarak genişletilir. Kabuk seçeneği nocasematch etkinleştirilirse, eşleme alfabetik karakterlerin durumuna bakılmaksızın gerçekleştirilir .
Hem Pattern Matching
ve Pathname Expansion
bash kılavuzunda içindeki aynı anlamında kullanılmaktadır.
Kılavuzda görebildiğim tek fark:
`[[ … ]]` case
tilde expansion tilde expansion
parameter and variable expansion parameter and variable expansion
arithmetic expansion arithmetic substitution
command substitution command substitution
process substitution process substitution
quote removal
Bu quote removal
, vaka yapısı için açıkça listelenmez.
Hangisi bununla tam olarak eşleşir (için [[ … ]]
):
Desenin herhangi bir kısmı, onu bir dize olarak eşleşmeye zorlamak için alıntılanabilir.
Bu son noktayı test etmek için bunu kullanın (şimdi değişken bir desen değildir ):
case "$1" in
"$pattern") echo case match
esac
Örtük extglob
:
Bash 4.3 sürümünden beri
'==' ve '! =' Operatörleri kullanıldığında, operatörün sağındaki dize bir desen olarak kabul edilir ve extglob kabuk seçeneği etkinmiş gibi , Desen Eşleme'de aşağıda açıklanan kurallara göre eşleştirilir .
Bu, extglob
unset seçeneğiyle kullanılan bir desenin , bir case deyiminde ve [[
bash 4.3 sürümünden sonra bir yapı içinde farklı şekilde çalışacağı anlamına gelir .
Örtük |
:
Vaka için sözdizimi:
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
Bu, bir |
(VEYA) ile ayrılmış birkaç desenin olabileceği anlamına gelir .
Bunun gibi:
shopt -s extglob; p1="+([0-9])"; p2="+([abcde])"
case "$1" in
$p1|$p2) echo "or case match" ; ;;
esac
Hangi sadece numaraları veya sadece harflerden oluşan bir dize ya maç olacak abcde
gibi 1234
ya aabee
ama 12a
ya b23
.
Normal ifade (var p3'e bakın) kullanılırsa A [[
eşit olarak çalışır :
#!/bin/bash
shopt -s extglob ### Use extended globbing.
shopt -s globasciiranges ### The range [a-z] will expand to [abcdefghijklmnopqrstuvwxyz].
pattern="+([0-9])"
p1="+([0-9])"
p2="+([a-z])"
p3="^([0-9]+|[a-z]+)$"
case "$1" in
$pattern) echo case1 match ; ;&
$p1|$p2) echo case2 match ; ;;
esac
[[ "$1" == $pattern ]] && echo if1 match
[[ "$1" =~ $p3 ]] && echo if2 match
shopt
ayarlar ve değerler$1
yapattern
, ne de$?
sonradan. Tek fark,$1
altında çalışırken çıkışta genişletilmemesidirxtrace
.