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 caseyapı 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 Matchingve Pathname Expansionbash 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 abcdegibi 1234ya aabeeama 12aya 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
shoptayarlar ve değerler$1yapattern, ne de$?sonradan. Tek fark,$1altında çalışırken çıkışta genişletilmemesidirxtrace.